diff --git a/README.md b/README.md
index 16d1c8b..81ac4eb 100644
--- a/README.md
+++ b/README.md
@@ -55,8 +55,7 @@
 rsync -avP images/update.raucb somewhere.example.org:path/to/web/root
 
 # target, perhaps via an USB console or over SSH
-wget http://somewhere.example.org/update.raucb -O /tmp/update.raucb
-rauc install /tmp/update.raucb
+rauc install http://somewhere.example.org/update.raucb
 reboot
 ```
 
@@ -85,9 +84,9 @@
 The MAC addresses are found on the label at the front panel.
 
 ```
-=> setenv eth1addr 00:11:17:01:00:4c
-=> setenv eth2addr 00:11:17:01:00:4d
-=> setenv eth3addr 00:11:17:01:00:4e
+=> setenv eth1addr 00:11:17:01:XX:XX
+=> setenv eth2addr 00:11:17:01:XX:YY
+=> setenv eth3addr 00:11:17:01:XX:ZZ
 => setenv czechlight sdn-roadm-line
 => saveenv
 Saving Environment to MMC... Writing to redundant MMC(0)... OK
@@ -97,7 +96,8 @@
 Once the system boots (which currently requires a reboot for some unknown reason -- fsck, perhaps?), configure hostname, plug in the network cable, and update SW:
 
 ```console
-# hostnamectl set-hostname line-DQ000OE6
+# hostnamectl set-hostname line-XYZSERIALNO
 # cp /etc/hostname /cfg/etc/
-# vorvan-update
+# rauc install http://somewhere.example.org/update.raucb
+# reboot
 ```
diff --git a/board/czechlight/clearfog/patches/linux.patch b/board/czechlight/clearfog/patches/linux.patch
index c7e0fae..7fda40a 100644
--- a/board/czechlight/clearfog/patches/linux.patch
+++ b/board/czechlight/clearfog/patches/linux.patch
@@ -1,76 +1,5 @@
-diff --git a/Documentation/devicetree/bindings/mtd/fsl-quadspi.txt b/Documentation/devicetree/bindings/mtd/fsl-quadspi.txt
-deleted file mode 100644
-index 483e9cfac1b1..000000000000
---- a/Documentation/devicetree/bindings/mtd/fsl-quadspi.txt
-+++ /dev/null
-@@ -1,65 +0,0 @@
--* Freescale Quad Serial Peripheral Interface(QuadSPI)
--
--Required properties:
--  - compatible : Should be "fsl,vf610-qspi", "fsl,imx6sx-qspi",
--		 "fsl,imx7d-qspi", "fsl,imx6ul-qspi",
--		 "fsl,ls1021a-qspi"
--		 or
--		 "fsl,ls2080a-qspi" followed by "fsl,ls1021a-qspi",
--		 "fsl,ls1043a-qspi" followed by "fsl,ls1021a-qspi"
--  - reg : the first contains the register location and length,
--          the second contains the memory mapping address and length
--  - reg-names: Should contain the reg names "QuadSPI" and "QuadSPI-memory"
--  - interrupts : Should contain the interrupt for the device
--  - clocks : The clocks needed by the QuadSPI controller
--  - clock-names : Should contain the name of the clocks: "qspi_en" and "qspi".
--
--Optional properties:
--  - fsl,qspi-has-second-chip: The controller has two buses, bus A and bus B.
--                              Each bus can be connected with two NOR flashes.
--			      Most of the time, each bus only has one NOR flash
--			      connected, this is the default case.
--			      But if there are two NOR flashes connected to the
--			      bus, you should enable this property.
--			      (Please check the board's schematic.)
--  - big-endian : That means the IP register is big endian
--
--Example:
--
--qspi0: quadspi@40044000 {
--	compatible = "fsl,vf610-qspi";
--	reg = <0x40044000 0x1000>, <0x20000000 0x10000000>;
--	reg-names = "QuadSPI", "QuadSPI-memory";
--	interrupts = <0 24 IRQ_TYPE_LEVEL_HIGH>;
--	clocks = <&clks VF610_CLK_QSPI0_EN>,
--		<&clks VF610_CLK_QSPI0>;
--	clock-names = "qspi_en", "qspi";
--
--	flash0: s25fl128s@0 {
--		....
--	};
--};
--
--Example showing the usage of two SPI NOR devices:
--
--&qspi2 {
--	pinctrl-names = "default";
--	pinctrl-0 = <&pinctrl_qspi2>;
--	status = "okay";
--
--	flash0: n25q256a@0 {
--		#address-cells = <1>;
--		#size-cells = <1>;
--		compatible = "micron,n25q256a", "jedec,spi-nor";
--		spi-max-frequency = <29000000>;
--		reg = <0>;
--	};
--
--	flash1: n25q256a@1 {
--		#address-cells = <1>;
--		#size-cells = <1>;
--		compatible = "micron,n25q256a", "jedec,spi-nor";
--		spi-max-frequency = <29000000>;
--		reg = <1>;
--	};
--};
 diff --git a/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt b/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt
-index 625a22e2f211..a0b1eb9aedad 100644
+index 8b94aa8f5971..2723e6143aa9 100644
 --- a/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt
 +++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt
 @@ -144,3 +144,38 @@ gpio21: gpio@21 {
@@ -112,686 +41,11 @@
 +		gpio-line-names = ...
 +	};
 +};
-diff --git a/Documentation/devicetree/bindings/spi/atmel-quadspi.txt b/Documentation/devicetree/bindings/spi/atmel-quadspi.txt
-index b93c1e2f25dd..7c40ea694352 100644
---- a/Documentation/devicetree/bindings/spi/atmel-quadspi.txt
-+++ b/Documentation/devicetree/bindings/spi/atmel-quadspi.txt
-@@ -1,14 +1,19 @@
- * Atmel Quad Serial Peripheral Interface (QSPI)
- 
- Required properties:
--- compatible:     Should be "atmel,sama5d2-qspi".
-+- compatible:     Should be one of the following:
-+		  - "atmel,sama5d2-qspi"
-+		  - "microchip,sam9x60-qspi"
- - reg:            Should contain the locations and lengths of the base registers
-                   and the mapped memory.
- - reg-names:      Should contain the resource reg names:
-                   - qspi_base: configuration register address space
-                   - qspi_mmap: memory mapped address space
- - interrupts:     Should contain the interrupt for the device.
--- clocks:         The phandle of the clock needed by the QSPI controller.
-+- clocks:         Should reference the peripheral clock and the QSPI system
-+                  clock if available.
-+- clock-names:    Should contain "pclk" for the peripheral clock and "qspick"
-+                  for the system clock when available.
- - #address-cells: Should be <1>.
- - #size-cells:    Should be <0>.
- 
-@@ -19,7 +24,8 @@ spi@f0020000 {
- 	reg = <0xf0020000 0x100>, <0xd0000000 0x8000000>;
- 	reg-names = "qspi_base", "qspi_mmap";
- 	interrupts = <52 IRQ_TYPE_LEVEL_HIGH 7>;
--	clocks = <&spi0_clk>;
-+	clocks = <&pmc PMC_TYPE_PERIPHERAL 52>;
-+	clock-names = "pclk";
- 	#address-cells = <1>;
- 	#size-cells = <0>;
- 	pinctrl-names = "default";
-diff --git a/Documentation/devicetree/bindings/spi/fsl-imx-cspi.txt b/Documentation/devicetree/bindings/spi/fsl-imx-cspi.txt
-index e3c48b20b1a6..2d3264140cc5 100644
---- a/Documentation/devicetree/bindings/spi/fsl-imx-cspi.txt
-+++ b/Documentation/devicetree/bindings/spi/fsl-imx-cspi.txt
-@@ -10,6 +10,7 @@ Required properties:
-   - "fsl,imx35-cspi" for SPI compatible with the one integrated on i.MX35
-   - "fsl,imx51-ecspi" for SPI compatible with the one integrated on i.MX51
-   - "fsl,imx53-ecspi" for SPI compatible with the one integrated on i.MX53 and later Soc
-+  - "fsl,imx8mq-ecspi" for SPI compatible with the one integrated on i.MX8M
- - reg : Offset and length of the register set for the device
- - interrupts : Should contain CSPI/eCSPI interrupt
- - clocks : Clock specifiers for both ipg and per clocks.
-diff --git a/Documentation/devicetree/bindings/spi/spi-fsl-qspi.txt b/Documentation/devicetree/bindings/spi/spi-fsl-qspi.txt
-new file mode 100644
-index 000000000000..e8f1d627d288
---- /dev/null
-+++ b/Documentation/devicetree/bindings/spi/spi-fsl-qspi.txt
-@@ -0,0 +1,63 @@
-+* Freescale Quad Serial Peripheral Interface(QuadSPI)
-+
-+Required properties:
-+  - compatible : Should be "fsl,vf610-qspi", "fsl,imx6sx-qspi",
-+		 "fsl,imx7d-qspi", "fsl,imx6ul-qspi",
-+		 "fsl,ls1021a-qspi"
-+		 or
-+		 "fsl,ls2080a-qspi" followed by "fsl,ls1021a-qspi",
-+		 "fsl,ls1043a-qspi" followed by "fsl,ls1021a-qspi"
-+  - reg : the first contains the register location and length,
-+          the second contains the memory mapping address and length
-+  - reg-names: Should contain the reg names "QuadSPI" and "QuadSPI-memory"
-+  - interrupts : Should contain the interrupt for the device
-+  - clocks : The clocks needed by the QuadSPI controller
-+  - clock-names : Should contain the name of the clocks: "qspi_en" and "qspi".
-+
-+Required SPI slave node properties:
-+  - reg: There are two buses (A and B) with two chip selects each.
-+	 This encodes to which bus and CS the flash is connected:
-+		<0>: Bus A, CS 0
-+		<1>: Bus A, CS 1
-+		<2>: Bus B, CS 0
-+		<3>: Bus B, CS 1
-+
-+Example:
-+
-+qspi0: quadspi@40044000 {
-+	compatible = "fsl,vf610-qspi";
-+	reg = <0x40044000 0x1000>, <0x20000000 0x10000000>;
-+	reg-names = "QuadSPI", "QuadSPI-memory";
-+	interrupts = <0 24 IRQ_TYPE_LEVEL_HIGH>;
-+	clocks = <&clks VF610_CLK_QSPI0_EN>,
-+		<&clks VF610_CLK_QSPI0>;
-+	clock-names = "qspi_en", "qspi";
-+
-+	flash0: s25fl128s@0 {
-+		....
-+	};
-+};
-+
-+Example showing the usage of two SPI NOR devices on bus A:
-+
-+&qspi2 {
-+	pinctrl-names = "default";
-+	pinctrl-0 = <&pinctrl_qspi2>;
-+	status = "okay";
-+
-+	flash0: n25q256a@0 {
-+		#address-cells = <1>;
-+		#size-cells = <1>;
-+		compatible = "micron,n25q256a", "jedec,spi-nor";
-+		spi-max-frequency = <29000000>;
-+		reg = <0>;
-+	};
-+
-+	flash1: n25q256a@1 {
-+		#address-cells = <1>;
-+		#size-cells = <1>;
-+		compatible = "micron,n25q256a", "jedec,spi-nor";
-+		spi-max-frequency = <29000000>;
-+		reg = <1>;
-+	};
-+};
-diff --git a/Documentation/devicetree/bindings/spi/spi-nxp-fspi.txt b/Documentation/devicetree/bindings/spi/spi-nxp-fspi.txt
-new file mode 100644
-index 000000000000..2cd67eb727d4
---- /dev/null
-+++ b/Documentation/devicetree/bindings/spi/spi-nxp-fspi.txt
-@@ -0,0 +1,39 @@
-+* NXP Flex Serial Peripheral Interface (FSPI)
-+
-+Required properties:
-+  - compatible : Should be "nxp,lx2160a-fspi"
-+  - reg :        First contains the register location and length,
-+                 Second contains the memory mapping address and length
-+  - reg-names :  Should contain the resource reg names:
-+	         - fspi_base: configuration register address space
-+                 - fspi_mmap: memory mapped address space
-+  - interrupts : Should contain the interrupt for the device
-+
-+Required SPI slave node properties:
-+  - reg :        There are two buses (A and B) with two chip selects each.
-+                 This encodes to which bus and CS the flash is connected:
-+                 - <0>: Bus A, CS 0
-+                 - <1>: Bus A, CS 1
-+                 - <2>: Bus B, CS 0
-+                 - <3>: Bus B, CS 1
-+
-+Example showing the usage of two SPI NOR slave devices on bus A:
-+
-+fspi0: spi@20c0000 {
-+	compatible = "nxp,lx2160a-fspi";
-+	reg = <0x0 0x20c0000 0x0 0x10000>, <0x0 0x20000000 0x0 0x10000000>;
-+	reg-names = "fspi_base", "fspi_mmap";
-+	interrupts = <0 25 0x4>; /* Level high type */
-+	clocks = <&clockgen 4 3>, <&clockgen 4 3>;
-+	clock-names = "fspi_en", "fspi";
-+
-+	mt35xu512aba0: flash@0 {
-+		reg = <0>;
-+		....
-+	};
-+
-+	mt35xu512aba1: flash@1 {
-+		reg = <1>;
-+		....
-+	};
-+};
-diff --git a/Documentation/devicetree/bindings/spi/spi-sifive.txt b/Documentation/devicetree/bindings/spi/spi-sifive.txt
-new file mode 100644
-index 000000000000..3f5c6e438972
---- /dev/null
-+++ b/Documentation/devicetree/bindings/spi/spi-sifive.txt
-@@ -0,0 +1,37 @@
-+SiFive SPI controller Device Tree Bindings
-+------------------------------------------
-+
-+Required properties:
-+- compatible		: Should be "sifive,<chip>-spi" and "sifive,spi<version>".
-+			  Supported compatible strings are:
-+			  "sifive,fu540-c000-spi" for the SiFive SPI v0 as integrated
-+			  onto the SiFive FU540 chip, and "sifive,spi0" for the SiFive
-+			  SPI v0 IP block with no chip integration tweaks.
-+			  Please refer to sifive-blocks-ip-versioning.txt for details
-+- reg			: Physical base address and size of SPI registers map
-+			  A second (optional) range can indicate memory mapped flash
-+- interrupts		: Must contain one entry
-+- interrupt-parent	: Must be core interrupt controller
-+- clocks		: Must reference the frequency given to the controller
-+- #address-cells	: Must be '1', indicating which CS to use
-+- #size-cells		: Must be '0'
-+
-+Optional properties:
-+- sifive,fifo-depth		: Depth of hardware queues; defaults to 8
-+- sifive,max-bits-per-word	: Maximum bits per word; defaults to 8
-+
-+SPI RTL that corresponds to the IP block version numbers can be found here:
-+https://github.com/sifive/sifive-blocks/tree/master/src/main/scala/devices/spi
-+
-+Example:
-+	spi: spi@10040000 {
-+		compatible = "sifive,fu540-c000-spi", "sifive,spi0";
-+		reg = <0x0 0x10040000 0x0 0x1000 0x0 0x20000000 0x0 0x10000000>;
-+		interrupt-parent = <&plic>;
-+		interrupts = <51>;
-+		clocks = <&tlclk>;
-+		#address-cells = <1>;
-+		#size-cells = <0>;
-+		sifive,fifo-depth = <8>;
-+		sifive,max-bits-per-word = <8>;
-+	};
-diff --git a/Documentation/devicetree/bindings/spi/spi-sprd.txt b/Documentation/devicetree/bindings/spi/spi-sprd.txt
-index bad211a19da4..3c7eacce0ee3 100644
---- a/Documentation/devicetree/bindings/spi/spi-sprd.txt
-+++ b/Documentation/devicetree/bindings/spi/spi-sprd.txt
-@@ -14,6 +14,11 @@ Required properties:
- 	address on the SPI bus. Should be set to 1.
- - #size-cells: Should be set to 0.
- 
-+Optional properties:
-+dma-names: Should contain names of the SPI used DMA channel.
-+dmas: Should contain DMA channels and DMA slave ids which the SPI used
-+	sorted in the same order as the dma-names property.
-+
- Example:
- spi0: spi@70a00000{
- 	compatible = "sprd,sc9860-spi";
-@@ -21,6 +26,8 @@ spi0: spi@70a00000{
- 	interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
- 	clock-names = "spi", "source","enable";
- 	clocks = <&clk_spi0>, <&ext_26m>, <&clk_ap_apb_gates 5>;
-+	dma-names = "rx_chn", "tx_chn";
-+	dmas = <&apdma 11 11>, <&apdma 12 12>;
- 	#address-cells = <1>;
- 	#size-cells = <0>;
- };
-diff --git a/Documentation/devicetree/bindings/spi/spi-stm32.txt b/Documentation/devicetree/bindings/spi/spi-stm32.txt
-index 1b3fa2c119d5..d82755c63eaf 100644
---- a/Documentation/devicetree/bindings/spi/spi-stm32.txt
-+++ b/Documentation/devicetree/bindings/spi/spi-stm32.txt
-@@ -7,7 +7,9 @@ from 4 to 32-bit data size. Although it can be configured as master or slave,
- only master is supported by the driver.
- 
- Required properties:
--- compatible: Must be "st,stm32h7-spi".
-+- compatible: Should be one of:
-+  "st,stm32h7-spi"
-+  "st,stm32f4-spi"
- - reg: Offset and length of the device's register set.
- - interrupts: Must contain the interrupt id.
- - clocks: Must contain an entry for spiclk (which feeds the internal clock
-@@ -30,8 +32,9 @@ Child nodes represent devices on the SPI bus
-   See ../spi/spi-bus.txt
- 
- Optional properties:
--- st,spi-midi-ns: (Master Inter-Data Idleness) minimum time delay in
--		  nanoseconds inserted between two consecutive data frames.
-+- st,spi-midi-ns: Only for STM32H7, (Master Inter-Data Idleness) minimum time
-+		  delay in nanoseconds inserted between two consecutive data
-+		  frames.
- 
- 
- Example:
-diff --git a/Documentation/spi/pxa2xx b/Documentation/spi/pxa2xx
-index 13a0b7fb192f..551325b66b23 100644
---- a/Documentation/spi/pxa2xx
-+++ b/Documentation/spi/pxa2xx
-@@ -21,15 +21,15 @@ Typically a SPI master is defined in the arch/.../mach-*/board-*.c as a
- "platform device".  The master configuration is passed to the driver via a table
- found in include/linux/spi/pxa2xx_spi.h:
- 
--struct pxa2xx_spi_master {
-+struct pxa2xx_spi_controller {
- 	u16 num_chipselect;
- 	u8 enable_dma;
- };
- 
--The "pxa2xx_spi_master.num_chipselect" field is used to determine the number of
-+The "pxa2xx_spi_controller.num_chipselect" field is used to determine the number of
- slave device (chips) attached to this SPI master.
- 
--The "pxa2xx_spi_master.enable_dma" field informs the driver that SSP DMA should
-+The "pxa2xx_spi_controller.enable_dma" field informs the driver that SSP DMA should
- be used.  This caused the driver to acquire two DMA channels: rx_channel and
- tx_channel.  The rx_channel has a higher DMA service priority the tx_channel.
- See the "PXA2xx Developer Manual" section "DMA Controller".
-@@ -51,7 +51,7 @@ static struct resource pxa_spi_nssp_resources[] = {
- 	},
- };
- 
--static struct pxa2xx_spi_master pxa_nssp_master_info = {
-+static struct pxa2xx_spi_controller pxa_nssp_master_info = {
- 	.num_chipselect = 1, /* Matches the number of chips attached to NSSP */
- 	.enable_dma = 1, /* Enables NSSP DMA */
- };
-@@ -206,7 +206,7 @@ DMA and PIO I/O Support
- -----------------------
- The pxa2xx_spi driver supports both DMA and interrupt driven PIO message
- transfers.  The driver defaults to PIO mode and DMA transfers must be enabled
--by setting the "enable_dma" flag in the "pxa2xx_spi_master" structure.  The DMA
-+by setting the "enable_dma" flag in the "pxa2xx_spi_controller" structure.  The DMA
- mode supports both coherent and stream based DMA mappings.
- 
- The following logic is used to determine the type of I/O to be used on
-diff --git a/MAINTAINERS b/MAINTAINERS
-index dce5c099f43c..ecb33bcc0ce4 100644
---- a/MAINTAINERS
-+++ b/MAINTAINERS
-@@ -6105,9 +6105,9 @@ F:	Documentation/devicetree/bindings/ptp/ptp-qoriq.txt
- 
- FREESCALE QUAD SPI DRIVER
- M:	Han Xu <han.xu@nxp.com>
--L:	linux-mtd@lists.infradead.org
-+L:	linux-spi@vger.kernel.org
- S:	Maintained
--F:	drivers/mtd/spi-nor/fsl-quadspi.c
-+F:	drivers/spi/spi-fsl-qspi.c
- 
- FREESCALE QUICC ENGINE LIBRARY
- M:	Qiang Zhao <qiang.zhao@nxp.com>
-@@ -10944,6 +10944,14 @@ F:	lib/objagg.c
- F:	lib/test_objagg.c
- F:	include/linux/objagg.h
- 
-+NXP FSPI DRIVER
-+R:	Yogesh Gaur <yogeshgaur.83@gmail.com>
-+M:	Ashish Kumar <ashish.kumar@nxp.com>
-+L:	linux-spi@vger.kernel.org
-+S:	Maintained
-+F:	drivers/spi/spi-nxp-fspi.c
-+F:	Documentation/devicetree/bindings/spi/spi-nxp-fspi.txt
-+
- OBJTOOL
- M:	Josh Poimboeuf <jpoimboe@redhat.com>
- M:	Peter Zijlstra <peterz@infradead.org>
-diff --git a/arch/arm/mach-pxa/cm-x255.c b/arch/arm/mach-pxa/cm-x255.c
-index fa8e7dd4d898..4401dfcd7e68 100644
---- a/arch/arm/mach-pxa/cm-x255.c
-+++ b/arch/arm/mach-pxa/cm-x255.c
-@@ -98,7 +98,7 @@ static unsigned long cmx255_pin_config[] = {
- };
- 
- #if defined(CONFIG_SPI_PXA2XX)
--static struct pxa2xx_spi_master pxa_ssp_master_info = {
-+static struct pxa2xx_spi_controller pxa_ssp_master_info = {
- 	.num_chipselect	= 1,
- };
- 
-diff --git a/arch/arm/mach-pxa/cm-x270.c b/arch/arm/mach-pxa/cm-x270.c
-index f7081a50dc67..279eeca7add0 100644
---- a/arch/arm/mach-pxa/cm-x270.c
-+++ b/arch/arm/mach-pxa/cm-x270.c
-@@ -313,7 +313,7 @@ static inline void cmx270_init_mmc(void) {}
- #endif
- 
- #if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
--static struct pxa2xx_spi_master cm_x270_spi_info = {
-+static struct pxa2xx_spi_controller cm_x270_spi_info = {
- 	.num_chipselect	= 1,
- 	.enable_dma	= 1,
- };
-diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c
-index c9732cace5e3..7ecf559bd71c 100644
---- a/arch/arm/mach-pxa/corgi.c
-+++ b/arch/arm/mach-pxa/corgi.c
-@@ -530,7 +530,7 @@ static struct pxa2xx_udc_mach_info udc_info __initdata = {
- };
- 
- #if IS_ENABLED(CONFIG_SPI_PXA2XX)
--static struct pxa2xx_spi_master corgi_spi_info = {
-+static struct pxa2xx_spi_controller corgi_spi_info = {
- 	.num_chipselect	= 3,
- };
- 
-diff --git a/arch/arm/mach-pxa/devices.c b/arch/arm/mach-pxa/devices.c
-index a24783a03827..524d6093e0c7 100644
---- a/arch/arm/mach-pxa/devices.c
-+++ b/arch/arm/mach-pxa/devices.c
-@@ -1065,7 +1065,7 @@ struct platform_device pxa93x_device_gpio = {
- 
- /* pxa2xx-spi platform-device ID equals respective SSP platform-device ID + 1.
-  * See comment in arch/arm/mach-pxa/ssp.c::ssp_probe() */
--void __init pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_master *info)
-+void __init pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_controller *info)
- {
- 	struct platform_device *pd;
- 
-diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
-index 32c1edeb3f14..5e372760f16e 100644
---- a/arch/arm/mach-pxa/em-x270.c
-+++ b/arch/arm/mach-pxa/em-x270.c
-@@ -689,7 +689,7 @@ static inline void em_x270_init_lcd(void) {}
- #endif
- 
- #if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
--static struct pxa2xx_spi_master em_x270_spi_info = {
-+static struct pxa2xx_spi_controller em_x270_spi_info = {
- 	.num_chipselect	= 1,
- };
- 
-@@ -703,7 +703,7 @@ static struct tdo24m_platform_data em_x270_tdo24m_pdata = {
- 	.model = TDO35S,
- };
- 
--static struct pxa2xx_spi_master em_x270_spi_2_info = {
-+static struct pxa2xx_spi_controller em_x270_spi_2_info = {
- 	.num_chipselect	= 1,
- 	.enable_dma	= 1,
- };
-diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c
-index b79b757fdd41..c3b47557b3f2 100644
---- a/arch/arm/mach-pxa/hx4700.c
-+++ b/arch/arm/mach-pxa/hx4700.c
-@@ -629,7 +629,7 @@ static struct spi_board_info tsc2046_board_info[] __initdata = {
- 	},
- };
- 
--static struct pxa2xx_spi_master pxa_ssp2_master_info = {
-+static struct pxa2xx_spi_controller pxa_ssp2_master_info = {
- 	.num_chipselect = 1,
- 	.enable_dma     = 1,
- };
-diff --git a/arch/arm/mach-pxa/icontrol.c b/arch/arm/mach-pxa/icontrol.c
-index cbaf4f6edcda..7e30452e3840 100644
---- a/arch/arm/mach-pxa/icontrol.c
-+++ b/arch/arm/mach-pxa/icontrol.c
-@@ -115,12 +115,12 @@ static struct spi_board_info mcp251x_board_info[] = {
- 	}
- };
- 
--static struct pxa2xx_spi_master pxa_ssp3_spi_master_info = {
-+static struct pxa2xx_spi_controller pxa_ssp3_spi_master_info = {
- 	.num_chipselect = 2,
- 	.enable_dma     = 1
- };
- 
--static struct pxa2xx_spi_master pxa_ssp4_spi_master_info = {
-+static struct pxa2xx_spi_controller pxa_ssp4_spi_master_info = {
- 	.num_chipselect = 2,
- 	.enable_dma     = 1
- };
-diff --git a/arch/arm/mach-pxa/littleton.c b/arch/arm/mach-pxa/littleton.c
-index 39db4898dc4a..464b8bd2bcb9 100644
---- a/arch/arm/mach-pxa/littleton.c
-+++ b/arch/arm/mach-pxa/littleton.c
-@@ -191,7 +191,7 @@ static inline void littleton_init_lcd(void) {};
- #endif /* CONFIG_FB_PXA || CONFIG_FB_PXA_MODULE */
- 
- #if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
--static struct pxa2xx_spi_master littleton_spi_info = {
-+static struct pxa2xx_spi_controller littleton_spi_info = {
- 	.num_chipselect		= 1,
- };
- 
-diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c
-index a1391e113ef4..c1bd0d544981 100644
---- a/arch/arm/mach-pxa/lubbock.c
-+++ b/arch/arm/mach-pxa/lubbock.c
-@@ -197,7 +197,7 @@ static struct platform_device sa1111_device = {
-  * (to J5) and poking board registers (as done below).  Else it's only useful
-  * for the temperature sensors.
-  */
--static struct pxa2xx_spi_master pxa_ssp_master_info = {
-+static struct pxa2xx_spi_controller pxa_ssp_master_info = {
- 	.num_chipselect	= 1,
- };
- 
-diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c
-index 08b079653c3f..618bcff4cdc9 100644
---- a/arch/arm/mach-pxa/magician.c
-+++ b/arch/arm/mach-pxa/magician.c
-@@ -932,7 +932,7 @@ struct pxa2xx_spi_chip tsc2046_chip_info = {
- 	.gpio_cs	= GPIO14_MAGICIAN_TSC2046_CS,
- };
- 
--static struct pxa2xx_spi_master magician_spi_info = {
-+static struct pxa2xx_spi_controller magician_spi_info = {
- 	.num_chipselect	= 1,
- 	.enable_dma	= 1,
- };
-diff --git a/arch/arm/mach-pxa/pcm027.c b/arch/arm/mach-pxa/pcm027.c
-index ccca9f7575c3..e2e613449660 100644
---- a/arch/arm/mach-pxa/pcm027.c
-+++ b/arch/arm/mach-pxa/pcm027.c
-@@ -132,7 +132,7 @@ static struct platform_device smc91x_device = {
- /*
-  * SPI host and devices
-  */
--static struct pxa2xx_spi_master pxa_ssp_master_info = {
-+static struct pxa2xx_spi_controller pxa_ssp_master_info = {
- 	.num_chipselect	= 1,
- };
- 
-diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c
-index c2a43d4cfd3e..9450a523cd0b 100644
---- a/arch/arm/mach-pxa/poodle.c
-+++ b/arch/arm/mach-pxa/poodle.c
-@@ -196,7 +196,7 @@ struct platform_device poodle_locomo_device = {
- EXPORT_SYMBOL(poodle_locomo_device);
- 
- #if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
--static struct pxa2xx_spi_master poodle_spi_info = {
-+static struct pxa2xx_spi_controller poodle_spi_info = {
- 	.num_chipselect	= 1,
- };
- 
-diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
-index 306818e2cf54..8dac824a85df 100644
---- a/arch/arm/mach-pxa/spitz.c
-+++ b/arch/arm/mach-pxa/spitz.c
-@@ -572,7 +572,7 @@ static struct spi_board_info spitz_spi_devices[] = {
- 	},
- };
- 
--static struct pxa2xx_spi_master spitz_spi_info = {
-+static struct pxa2xx_spi_controller spitz_spi_info = {
- 	.num_chipselect	= 3,
- };
- 
-diff --git a/arch/arm/mach-pxa/stargate2.c b/arch/arm/mach-pxa/stargate2.c
-index e0d6c872270a..c28d19b126a7 100644
---- a/arch/arm/mach-pxa/stargate2.c
-+++ b/arch/arm/mach-pxa/stargate2.c
-@@ -337,15 +337,15 @@ static struct platform_device stargate2_flash_device = {
- 	.num_resources = 1,
- };
- 
--static struct pxa2xx_spi_master pxa_ssp_master_0_info = {
-+static struct pxa2xx_spi_controller pxa_ssp_master_0_info = {
- 	.num_chipselect = 1,
- };
- 
--static struct pxa2xx_spi_master pxa_ssp_master_1_info = {
-+static struct pxa2xx_spi_controller pxa_ssp_master_1_info = {
- 	.num_chipselect = 1,
- };
- 
--static struct pxa2xx_spi_master pxa_ssp_master_2_info = {
-+static struct pxa2xx_spi_controller pxa_ssp_master_2_info = {
- 	.num_chipselect = 1,
- };
- 
-diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c
-index e8a93c088c35..7439798d58e4 100644
---- a/arch/arm/mach-pxa/tosa.c
-+++ b/arch/arm/mach-pxa/tosa.c
-@@ -813,7 +813,7 @@ static struct platform_device tosa_bt_device = {
- 	.dev.platform_data = &tosa_bt_data,
- };
- 
--static struct pxa2xx_spi_master pxa_ssp_master_info = {
-+static struct pxa2xx_spi_controller pxa_ssp_master_info = {
- 	.num_chipselect	= 1,
- };
- 
-diff --git a/arch/arm/mach-pxa/z2.c b/arch/arm/mach-pxa/z2.c
-index e2353e75bb28..ad082e11e2a4 100644
---- a/arch/arm/mach-pxa/z2.c
-+++ b/arch/arm/mach-pxa/z2.c
-@@ -607,12 +607,12 @@ static struct spi_board_info spi_board_info[] __initdata = {
- },
- };
- 
--static struct pxa2xx_spi_master pxa_ssp1_master_info = {
-+static struct pxa2xx_spi_controller pxa_ssp1_master_info = {
- 	.num_chipselect	= 1,
- 	.enable_dma	= 1,
- };
- 
--static struct pxa2xx_spi_master pxa_ssp2_master_info = {
-+static struct pxa2xx_spi_controller pxa_ssp2_master_info = {
- 	.num_chipselect	= 1,
- };
- 
-diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c
-index c411f79d4cb5..bdbcf46595f9 100644
---- a/arch/arm/mach-pxa/zeus.c
-+++ b/arch/arm/mach-pxa/zeus.c
-@@ -391,7 +391,7 @@ static struct platform_device zeus_sram_device = {
- };
- 
- /* SPI interface on SSP3 */
--static struct pxa2xx_spi_master pxa2xx_spi_ssp3_master_info = {
-+static struct pxa2xx_spi_controller pxa2xx_spi_ssp3_master_info = {
- 	.num_chipselect = 1,
- 	.enable_dma     = 1,
- };
-diff --git a/arch/mips/ath79/dev-spi.h b/arch/mips/ath79/dev-spi.h
-index d732565ca736..6e15bc8651be 100644
---- a/arch/mips/ath79/dev-spi.h
-+++ b/arch/mips/ath79/dev-spi.h
-@@ -13,7 +13,7 @@
- #define _ATH79_DEV_SPI_H
- 
- #include <linux/spi/spi.h>
--#include <asm/mach-ath79/ath79_spi_platform.h>
-+#include <linux/platform_data/spi-ath79.h>
- 
- void ath79_register_spi(struct ath79_spi_platform_data *pdata,
- 			 struct spi_board_info const *info,
-diff --git a/arch/mips/include/asm/mach-ath79/ath79_spi_platform.h b/arch/mips/include/asm/mach-ath79/ath79_spi_platform.h
-deleted file mode 100644
-index aa71216edf99..000000000000
---- a/arch/mips/include/asm/mach-ath79/ath79_spi_platform.h
-+++ /dev/null
-@@ -1,19 +0,0 @@
--/*
-- *  Platform data definition for Atheros AR71XX/AR724X/AR913X SPI controller
-- *
-- *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
-- *
-- *  This program is free software; you can redistribute it and/or modify it
-- *  under the terms of the GNU General Public License version 2 as published
-- *  by the Free Software Foundation.
-- */
--
--#ifndef _ATH79_SPI_PLATFORM_H
--#define _ATH79_SPI_PLATFORM_H
--
--struct ath79_spi_platform_data {
--	unsigned	bus_num;
--	unsigned	num_chipselect;
--};
--
--#endif /* _ATH79_SPI_PLATFORM_H */
-diff --git a/drivers/gpio/gpiolib-devprop.c b/drivers/gpio/gpiolib-devprop.c
-index dd517098ab95..0c6f97c09bd9 100644
---- a/drivers/gpio/gpiolib-devprop.c
-+++ b/drivers/gpio/gpiolib-devprop.c
-@@ -56,3 +56,5 @@ void devprop_gpiochip_set_names(struct gpio_chip *chip,
- 
- 	kfree(names);
- }
-+
-+EXPORT_SYMBOL_GPL(devprop_gpiochip_set_names)
-diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
-index a6e1891217e2..c34eb9d9c59a 100644
---- a/drivers/gpio/gpiolib-of.c
-+++ b/drivers/gpio/gpiolib-of.c
-@@ -125,7 +125,7 @@ static void of_gpio_flags_quirks(struct device_node *np,
- 
- 		for_each_child_of_node(np, child) {
- 			ret = of_property_read_u32(child, "reg", &cs);
--			if (!ret)
-+			if (ret)
- 				continue;
- 			if (cs == index) {
- 				/*
-diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h
-index bc57f0dc5953..0c512900752d 100644
---- a/drivers/gpio/gpiolib.h
-+++ b/drivers/gpio/gpiolib.h
-@@ -241,9 +241,6 @@ static inline int gpio_chip_hwgpio(const struct gpio_desc *desc)
- 	return desc - &desc->gdev->descs[0];
- }
- 
--void devprop_gpiochip_set_names(struct gpio_chip *chip,
--				const struct fwnode_handle *fwnode);
--
- /* With descriptor prefix */
- 
- #define gpiod_emerg(desc, fmt, ...)					       \
-diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c
-index a5a95ea5b81a..469374ded7ae 100644
---- a/drivers/i2c/busses/i2c-mv64xxx.c
-+++ b/drivers/i2c/busses/i2c-mv64xxx.c
-@@ -317,6 +317,14 @@ mv64xxx_i2c_fsm(struct mv64xxx_i2c_data *drv_data, u32 status)
- 		drv_data->rc = -ENXIO;
- 		break;
- 
-+	case MV64XXX_I2C_STATUS_BUS_ERR: /* 0x00 */
-+		dev_warn(&drv_data->adapter.dev,
-+			 "bus error: slave has driven SDA/SCL unexpectedly\n");
-+		drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP;
-+		mv64xxx_i2c_hw_init(drv_data);
-+		drv_data->rc = -EIO;
-+		break;
-+
- 	default:
- 		dev_err(&drv_data->adapter.dev,
- 			"mv64xxx_i2c_fsm: Ctlr Error -- state: 0x%x, "
 diff --git a/drivers/leds/leds-tlc591xx.c b/drivers/leds/leds-tlc591xx.c
-index f5357f6d9e58..efbe9c83c514 100644
+index 59ff088c7d75..c7c6f753b0d3 100644
 --- a/drivers/leds/leds-tlc591xx.c
 +++ b/drivers/leds/leds-tlc591xx.c
-@@ -42,6 +42,9 @@
+@@ -39,6 +39,9 @@
  
  #define ldev_to_led(c)		container_of(c, struct tlc591xx_led, ldev)
  
@@ -801,7 +55,7 @@
  struct tlc591xx_led {
  	bool active;
  	unsigned int led_no;
-@@ -53,21 +56,25 @@ struct tlc591xx_priv {
+@@ -50,21 +53,25 @@ struct tlc591xx_priv {
  	struct tlc591xx_led leds[TLC591XX_MAX_LEDS];
  	struct regmap *regmap;
  	unsigned int reg_ledout_offset;
@@ -827,7 +81,7 @@
  };
  
  static int
-@@ -140,6 +147,8 @@ tlc591xx_destroy_devices(struct tlc591xx_priv *priv, unsigned int j)
+@@ -137,6 +144,8 @@ tlc591xx_destroy_devices(struct tlc591xx_priv *priv, unsigned int j)
  		if (priv->leds[i].active)
  			led_classdev_unregister(&priv->leds[i].ldev);
  	}
@@ -836,7 +90,7 @@
  }
  
  static int
-@@ -245,6 +254,19 @@ tlc591xx_probe(struct i2c_client *client,
+@@ -242,6 +251,19 @@ tlc591xx_probe(struct i2c_client *client,
  		priv->leds[reg].ldev.default_trigger =
  			of_get_property(child, "linux,default-trigger", NULL);
  	}
@@ -856,1470 +110,11 @@
  	return tlc591xx_configure(dev, priv, tlc591xx);
  }
  
-diff --git a/drivers/mtd/spi-nor/Kconfig b/drivers/mtd/spi-nor/Kconfig
-index 44fe8018733c..b433e5f91069 100644
---- a/drivers/mtd/spi-nor/Kconfig
-+++ b/drivers/mtd/spi-nor/Kconfig
-@@ -50,15 +50,6 @@ config SPI_CADENCE_QUADSPI
- 	  device with a Cadence QSPI controller and want to access the
- 	  Flash as an MTD device.
- 
--config SPI_FSL_QUADSPI
--	tristate "Freescale Quad SPI controller"
--	depends on ARCH_MXC || SOC_LS1021A || ARCH_LAYERSCAPE || COMPILE_TEST
--	depends on HAS_IOMEM
--	help
--	  This enables support for the Quad SPI controller in master mode.
--	  This controller does not support generic SPI. It only supports
--	  SPI NOR.
--
- config SPI_HISI_SFC
- 	tristate "Hisilicon SPI-NOR Flash Controller(SFC)"
- 	depends on ARCH_HISI || COMPILE_TEST
-diff --git a/drivers/mtd/spi-nor/Makefile b/drivers/mtd/spi-nor/Makefile
-index a552efd22958..2adedbe07662 100644
---- a/drivers/mtd/spi-nor/Makefile
-+++ b/drivers/mtd/spi-nor/Makefile
-@@ -2,7 +2,6 @@
- obj-$(CONFIG_MTD_SPI_NOR)	+= spi-nor.o
- obj-$(CONFIG_SPI_ASPEED_SMC)	+= aspeed-smc.o
- obj-$(CONFIG_SPI_CADENCE_QUADSPI)	+= cadence-quadspi.o
--obj-$(CONFIG_SPI_FSL_QUADSPI)	+= fsl-quadspi.o
- obj-$(CONFIG_SPI_HISI_SFC)	+= hisi-sfc.o
- obj-$(CONFIG_MTD_MT81xx_NOR)    += mtk-quadspi.o
- obj-$(CONFIG_SPI_NXP_SPIFI)	+= nxp-spifi.o
-diff --git a/drivers/mtd/spi-nor/fsl-quadspi.c b/drivers/mtd/spi-nor/fsl-quadspi.c
-deleted file mode 100644
-index 1ff3430f82c8..000000000000
---- a/drivers/mtd/spi-nor/fsl-quadspi.c
-+++ /dev/null
-@@ -1,1224 +0,0 @@
--/*
-- * Freescale QuadSPI driver.
-- *
-- * Copyright (C) 2013 Freescale Semiconductor, Inc.
-- *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License as published by
-- * the Free Software Foundation; either version 2 of the License, or
-- * (at your option) any later version.
-- */
--#include <linux/kernel.h>
--#include <linux/module.h>
--#include <linux/interrupt.h>
--#include <linux/errno.h>
--#include <linux/platform_device.h>
--#include <linux/sched.h>
--#include <linux/delay.h>
--#include <linux/io.h>
--#include <linux/clk.h>
--#include <linux/err.h>
--#include <linux/of.h>
--#include <linux/of_device.h>
--#include <linux/timer.h>
--#include <linux/jiffies.h>
--#include <linux/completion.h>
--#include <linux/mtd/mtd.h>
--#include <linux/mtd/partitions.h>
--#include <linux/mtd/spi-nor.h>
--#include <linux/mutex.h>
--#include <linux/pm_qos.h>
--#include <linux/sizes.h>
--
--/* Controller needs driver to swap endian */
--#define QUADSPI_QUIRK_SWAP_ENDIAN	(1 << 0)
--/* Controller needs 4x internal clock */
--#define QUADSPI_QUIRK_4X_INT_CLK	(1 << 1)
--/*
-- * TKT253890, Controller needs driver to fill txfifo till 16 byte to
-- * trigger data transfer even though extern data will not transferred.
-- */
--#define QUADSPI_QUIRK_TKT253890		(1 << 2)
--/* Controller cannot wake up from wait mode, TKT245618 */
--#define QUADSPI_QUIRK_TKT245618         (1 << 3)
--
--/* The registers */
--#define QUADSPI_MCR			0x00
--#define QUADSPI_MCR_RESERVED_SHIFT	16
--#define QUADSPI_MCR_RESERVED_MASK	(0xF << QUADSPI_MCR_RESERVED_SHIFT)
--#define QUADSPI_MCR_MDIS_SHIFT		14
--#define QUADSPI_MCR_MDIS_MASK		(1 << QUADSPI_MCR_MDIS_SHIFT)
--#define QUADSPI_MCR_CLR_TXF_SHIFT	11
--#define QUADSPI_MCR_CLR_TXF_MASK	(1 << QUADSPI_MCR_CLR_TXF_SHIFT)
--#define QUADSPI_MCR_CLR_RXF_SHIFT	10
--#define QUADSPI_MCR_CLR_RXF_MASK	(1 << QUADSPI_MCR_CLR_RXF_SHIFT)
--#define QUADSPI_MCR_DDR_EN_SHIFT	7
--#define QUADSPI_MCR_DDR_EN_MASK		(1 << QUADSPI_MCR_DDR_EN_SHIFT)
--#define QUADSPI_MCR_END_CFG_SHIFT	2
--#define QUADSPI_MCR_END_CFG_MASK	(3 << QUADSPI_MCR_END_CFG_SHIFT)
--#define QUADSPI_MCR_SWRSTHD_SHIFT	1
--#define QUADSPI_MCR_SWRSTHD_MASK	(1 << QUADSPI_MCR_SWRSTHD_SHIFT)
--#define QUADSPI_MCR_SWRSTSD_SHIFT	0
--#define QUADSPI_MCR_SWRSTSD_MASK	(1 << QUADSPI_MCR_SWRSTSD_SHIFT)
--
--#define QUADSPI_IPCR			0x08
--#define QUADSPI_IPCR_SEQID_SHIFT	24
--#define QUADSPI_IPCR_SEQID_MASK		(0xF << QUADSPI_IPCR_SEQID_SHIFT)
--
--#define QUADSPI_BUF0CR			0x10
--#define QUADSPI_BUF1CR			0x14
--#define QUADSPI_BUF2CR			0x18
--#define QUADSPI_BUFXCR_INVALID_MSTRID	0xe
--
--#define QUADSPI_BUF3CR			0x1c
--#define QUADSPI_BUF3CR_ALLMST_SHIFT	31
--#define QUADSPI_BUF3CR_ALLMST_MASK	(1 << QUADSPI_BUF3CR_ALLMST_SHIFT)
--#define QUADSPI_BUF3CR_ADATSZ_SHIFT		8
--#define QUADSPI_BUF3CR_ADATSZ_MASK	(0xFF << QUADSPI_BUF3CR_ADATSZ_SHIFT)
--
--#define QUADSPI_BFGENCR			0x20
--#define QUADSPI_BFGENCR_PAR_EN_SHIFT	16
--#define QUADSPI_BFGENCR_PAR_EN_MASK	(1 << (QUADSPI_BFGENCR_PAR_EN_SHIFT))
--#define QUADSPI_BFGENCR_SEQID_SHIFT	12
--#define QUADSPI_BFGENCR_SEQID_MASK	(0xF << QUADSPI_BFGENCR_SEQID_SHIFT)
--
--#define QUADSPI_BUF0IND			0x30
--#define QUADSPI_BUF1IND			0x34
--#define QUADSPI_BUF2IND			0x38
--#define QUADSPI_SFAR			0x100
--
--#define QUADSPI_SMPR			0x108
--#define QUADSPI_SMPR_DDRSMP_SHIFT	16
--#define QUADSPI_SMPR_DDRSMP_MASK	(7 << QUADSPI_SMPR_DDRSMP_SHIFT)
--#define QUADSPI_SMPR_FSDLY_SHIFT	6
--#define QUADSPI_SMPR_FSDLY_MASK		(1 << QUADSPI_SMPR_FSDLY_SHIFT)
--#define QUADSPI_SMPR_FSPHS_SHIFT	5
--#define QUADSPI_SMPR_FSPHS_MASK		(1 << QUADSPI_SMPR_FSPHS_SHIFT)
--#define QUADSPI_SMPR_HSENA_SHIFT	0
--#define QUADSPI_SMPR_HSENA_MASK		(1 << QUADSPI_SMPR_HSENA_SHIFT)
--
--#define QUADSPI_RBSR			0x10c
--#define QUADSPI_RBSR_RDBFL_SHIFT	8
--#define QUADSPI_RBSR_RDBFL_MASK		(0x3F << QUADSPI_RBSR_RDBFL_SHIFT)
--
--#define QUADSPI_RBCT			0x110
--#define QUADSPI_RBCT_WMRK_MASK		0x1F
--#define QUADSPI_RBCT_RXBRD_SHIFT	8
--#define QUADSPI_RBCT_RXBRD_USEIPS	(0x1 << QUADSPI_RBCT_RXBRD_SHIFT)
--
--#define QUADSPI_TBSR			0x150
--#define QUADSPI_TBDR			0x154
--#define QUADSPI_SR			0x15c
--#define QUADSPI_SR_IP_ACC_SHIFT		1
--#define QUADSPI_SR_IP_ACC_MASK		(0x1 << QUADSPI_SR_IP_ACC_SHIFT)
--#define QUADSPI_SR_AHB_ACC_SHIFT	2
--#define QUADSPI_SR_AHB_ACC_MASK		(0x1 << QUADSPI_SR_AHB_ACC_SHIFT)
--
--#define QUADSPI_FR			0x160
--#define QUADSPI_FR_TFF_MASK		0x1
--
--#define QUADSPI_SFA1AD			0x180
--#define QUADSPI_SFA2AD			0x184
--#define QUADSPI_SFB1AD			0x188
--#define QUADSPI_SFB2AD			0x18c
--#define QUADSPI_RBDR			0x200
--
--#define QUADSPI_LUTKEY			0x300
--#define QUADSPI_LUTKEY_VALUE		0x5AF05AF0
--
--#define QUADSPI_LCKCR			0x304
--#define QUADSPI_LCKER_LOCK		0x1
--#define QUADSPI_LCKER_UNLOCK		0x2
--
--#define QUADSPI_RSER			0x164
--#define QUADSPI_RSER_TFIE		(0x1 << 0)
--
--#define QUADSPI_LUT_BASE		0x310
--
--/*
-- * The definition of the LUT register shows below:
-- *
-- *  ---------------------------------------------------
-- *  | INSTR1 | PAD1 | OPRND1 | INSTR0 | PAD0 | OPRND0 |
-- *  ---------------------------------------------------
-- */
--#define OPRND0_SHIFT		0
--#define PAD0_SHIFT		8
--#define INSTR0_SHIFT		10
--#define OPRND1_SHIFT		16
--
--/* Instruction set for the LUT register. */
--#define LUT_STOP		0
--#define LUT_CMD			1
--#define LUT_ADDR		2
--#define LUT_DUMMY		3
--#define LUT_MODE		4
--#define LUT_MODE2		5
--#define LUT_MODE4		6
--#define LUT_FSL_READ		7
--#define LUT_FSL_WRITE		8
--#define LUT_JMP_ON_CS		9
--#define LUT_ADDR_DDR		10
--#define LUT_MODE_DDR		11
--#define LUT_MODE2_DDR		12
--#define LUT_MODE4_DDR		13
--#define LUT_FSL_READ_DDR		14
--#define LUT_FSL_WRITE_DDR		15
--#define LUT_DATA_LEARN		16
--
--/*
-- * The PAD definitions for LUT register.
-- *
-- * The pad stands for the lines number of IO[0:3].
-- * For example, the Quad read need four IO lines, so you should
-- * set LUT_PAD4 which means we use four IO lines.
-- */
--#define LUT_PAD1		0
--#define LUT_PAD2		1
--#define LUT_PAD4		2
--
--/* Oprands for the LUT register. */
--#define ADDR24BIT		0x18
--#define ADDR32BIT		0x20
--
--/* Macros for constructing the LUT register. */
--#define LUT0(ins, pad, opr)						\
--		(((opr) << OPRND0_SHIFT) | ((LUT_##pad) << PAD0_SHIFT) | \
--		((LUT_##ins) << INSTR0_SHIFT))
--
--#define LUT1(ins, pad, opr)	(LUT0(ins, pad, opr) << OPRND1_SHIFT)
--
--/* other macros for LUT register. */
--#define QUADSPI_LUT(x)          (QUADSPI_LUT_BASE + (x) * 4)
--#define QUADSPI_LUT_NUM		64
--
--/* SEQID -- we can have 16 seqids at most. */
--#define SEQID_READ		0
--#define SEQID_WREN		1
--#define SEQID_WRDI		2
--#define SEQID_RDSR		3
--#define SEQID_SE		4
--#define SEQID_CHIP_ERASE	5
--#define SEQID_PP		6
--#define SEQID_RDID		7
--#define SEQID_WRSR		8
--#define SEQID_RDCR		9
--#define SEQID_EN4B		10
--#define SEQID_BRWR		11
--
--#define QUADSPI_MIN_IOMAP SZ_4M
--
--enum fsl_qspi_devtype {
--	FSL_QUADSPI_VYBRID,
--	FSL_QUADSPI_IMX6SX,
--	FSL_QUADSPI_IMX7D,
--	FSL_QUADSPI_IMX6UL,
--	FSL_QUADSPI_LS1021A,
--	FSL_QUADSPI_LS2080A,
--};
--
--struct fsl_qspi_devtype_data {
--	enum fsl_qspi_devtype devtype;
--	int rxfifo;
--	int txfifo;
--	int ahb_buf_size;
--	int driver_data;
--};
--
--static const struct fsl_qspi_devtype_data vybrid_data = {
--	.devtype = FSL_QUADSPI_VYBRID,
--	.rxfifo = 128,
--	.txfifo = 64,
--	.ahb_buf_size = 1024,
--	.driver_data = QUADSPI_QUIRK_SWAP_ENDIAN,
--};
--
--static const struct fsl_qspi_devtype_data imx6sx_data = {
--	.devtype = FSL_QUADSPI_IMX6SX,
--	.rxfifo = 128,
--	.txfifo = 512,
--	.ahb_buf_size = 1024,
--	.driver_data = QUADSPI_QUIRK_4X_INT_CLK
--		       | QUADSPI_QUIRK_TKT245618,
--};
--
--static const struct fsl_qspi_devtype_data imx7d_data = {
--	.devtype = FSL_QUADSPI_IMX7D,
--	.rxfifo = 512,
--	.txfifo = 512,
--	.ahb_buf_size = 1024,
--	.driver_data = QUADSPI_QUIRK_TKT253890
--		       | QUADSPI_QUIRK_4X_INT_CLK,
--};
--
--static const struct fsl_qspi_devtype_data imx6ul_data = {
--	.devtype = FSL_QUADSPI_IMX6UL,
--	.rxfifo = 128,
--	.txfifo = 512,
--	.ahb_buf_size = 1024,
--	.driver_data = QUADSPI_QUIRK_TKT253890
--		       | QUADSPI_QUIRK_4X_INT_CLK,
--};
--
--static struct fsl_qspi_devtype_data ls1021a_data = {
--	.devtype = FSL_QUADSPI_LS1021A,
--	.rxfifo = 128,
--	.txfifo = 64,
--	.ahb_buf_size = 1024,
--	.driver_data = 0,
--};
--
--static const struct fsl_qspi_devtype_data ls2080a_data = {
--	.devtype = FSL_QUADSPI_LS2080A,
--	.rxfifo = 128,
--	.txfifo = 64,
--	.ahb_buf_size = 1024,
--	.driver_data = QUADSPI_QUIRK_TKT253890,
--};
--
--
--#define FSL_QSPI_MAX_CHIP	4
--struct fsl_qspi {
--	struct spi_nor nor[FSL_QSPI_MAX_CHIP];
--	void __iomem *iobase;
--	void __iomem *ahb_addr;
--	u32 memmap_phy;
--	u32 memmap_offs;
--	u32 memmap_len;
--	struct clk *clk, *clk_en;
--	struct device *dev;
--	struct completion c;
--	const struct fsl_qspi_devtype_data *devtype_data;
--	u32 nor_size;
--	u32 nor_num;
--	u32 clk_rate;
--	unsigned int chip_base_addr; /* We may support two chips. */
--	bool has_second_chip;
--	bool big_endian;
--	struct mutex lock;
--	struct pm_qos_request pm_qos_req;
--};
--
--static inline int needs_swap_endian(struct fsl_qspi *q)
--{
--	return q->devtype_data->driver_data & QUADSPI_QUIRK_SWAP_ENDIAN;
--}
--
--static inline int needs_4x_clock(struct fsl_qspi *q)
--{
--	return q->devtype_data->driver_data & QUADSPI_QUIRK_4X_INT_CLK;
--}
--
--static inline int needs_fill_txfifo(struct fsl_qspi *q)
--{
--	return q->devtype_data->driver_data & QUADSPI_QUIRK_TKT253890;
--}
--
--static inline int needs_wakeup_wait_mode(struct fsl_qspi *q)
--{
--	return q->devtype_data->driver_data & QUADSPI_QUIRK_TKT245618;
--}
--
--/*
-- * R/W functions for big- or little-endian registers:
-- * The qSPI controller's endian is independent of the CPU core's endian.
-- * So far, although the CPU core is little-endian but the qSPI have two
-- * versions for big-endian and little-endian.
-- */
--static void qspi_writel(struct fsl_qspi *q, u32 val, void __iomem *addr)
--{
--	if (q->big_endian)
--		iowrite32be(val, addr);
--	else
--		iowrite32(val, addr);
--}
--
--static u32 qspi_readl(struct fsl_qspi *q, void __iomem *addr)
--{
--	if (q->big_endian)
--		return ioread32be(addr);
--	else
--		return ioread32(addr);
--}
--
--/*
-- * An IC bug makes us to re-arrange the 32-bit data.
-- * The following chips, such as IMX6SLX, have fixed this bug.
-- */
--static inline u32 fsl_qspi_endian_xchg(struct fsl_qspi *q, u32 a)
--{
--	return needs_swap_endian(q) ? __swab32(a) : a;
--}
--
--static inline void fsl_qspi_unlock_lut(struct fsl_qspi *q)
--{
--	qspi_writel(q, QUADSPI_LUTKEY_VALUE, q->iobase + QUADSPI_LUTKEY);
--	qspi_writel(q, QUADSPI_LCKER_UNLOCK, q->iobase + QUADSPI_LCKCR);
--}
--
--static inline void fsl_qspi_lock_lut(struct fsl_qspi *q)
--{
--	qspi_writel(q, QUADSPI_LUTKEY_VALUE, q->iobase + QUADSPI_LUTKEY);
--	qspi_writel(q, QUADSPI_LCKER_LOCK, q->iobase + QUADSPI_LCKCR);
--}
--
--static irqreturn_t fsl_qspi_irq_handler(int irq, void *dev_id)
--{
--	struct fsl_qspi *q = dev_id;
--	u32 reg;
--
--	/* clear interrupt */
--	reg = qspi_readl(q, q->iobase + QUADSPI_FR);
--	qspi_writel(q, reg, q->iobase + QUADSPI_FR);
--
--	if (reg & QUADSPI_FR_TFF_MASK)
--		complete(&q->c);
--
--	dev_dbg(q->dev, "QUADSPI_FR : 0x%.8x:0x%.8x\n", q->chip_base_addr, reg);
--	return IRQ_HANDLED;
--}
--
--static void fsl_qspi_init_lut(struct fsl_qspi *q)
--{
--	void __iomem *base = q->iobase;
--	int rxfifo = q->devtype_data->rxfifo;
--	u32 lut_base;
--	int i;
--
--	struct spi_nor *nor = &q->nor[0];
--	u8 addrlen = (nor->addr_width == 3) ? ADDR24BIT : ADDR32BIT;
--	u8 read_op = nor->read_opcode;
--	u8 read_dm = nor->read_dummy;
--
--	fsl_qspi_unlock_lut(q);
--
--	/* Clear all the LUT table */
--	for (i = 0; i < QUADSPI_LUT_NUM; i++)
--		qspi_writel(q, 0, base + QUADSPI_LUT_BASE + i * 4);
--
--	/* Read */
--	lut_base = SEQID_READ * 4;
--
--	qspi_writel(q, LUT0(CMD, PAD1, read_op) | LUT1(ADDR, PAD1, addrlen),
--			base + QUADSPI_LUT(lut_base));
--	qspi_writel(q, LUT0(DUMMY, PAD1, read_dm) |
--		    LUT1(FSL_READ, PAD4, rxfifo),
--			base + QUADSPI_LUT(lut_base + 1));
--
--	/* Write enable */
--	lut_base = SEQID_WREN * 4;
--	qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_WREN),
--			base + QUADSPI_LUT(lut_base));
--
--	/* Page Program */
--	lut_base = SEQID_PP * 4;
--
--	qspi_writel(q, LUT0(CMD, PAD1, nor->program_opcode) |
--		    LUT1(ADDR, PAD1, addrlen),
--			base + QUADSPI_LUT(lut_base));
--	qspi_writel(q, LUT0(FSL_WRITE, PAD1, 0),
--			base + QUADSPI_LUT(lut_base + 1));
--
--	/* Read Status */
--	lut_base = SEQID_RDSR * 4;
--	qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_RDSR) |
--			LUT1(FSL_READ, PAD1, 0x1),
--			base + QUADSPI_LUT(lut_base));
--
--	/* Erase a sector */
--	lut_base = SEQID_SE * 4;
--
--	qspi_writel(q, LUT0(CMD, PAD1, nor->erase_opcode) |
--		    LUT1(ADDR, PAD1, addrlen),
--			base + QUADSPI_LUT(lut_base));
--
--	/* Erase the whole chip */
--	lut_base = SEQID_CHIP_ERASE * 4;
--	qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_CHIP_ERASE),
--			base + QUADSPI_LUT(lut_base));
--
--	/* READ ID */
--	lut_base = SEQID_RDID * 4;
--	qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_RDID) |
--			LUT1(FSL_READ, PAD1, 0x8),
--			base + QUADSPI_LUT(lut_base));
--
--	/* Write Register */
--	lut_base = SEQID_WRSR * 4;
--	qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_WRSR) |
--			LUT1(FSL_WRITE, PAD1, 0x2),
--			base + QUADSPI_LUT(lut_base));
--
--	/* Read Configuration Register */
--	lut_base = SEQID_RDCR * 4;
--	qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_RDCR) |
--			LUT1(FSL_READ, PAD1, 0x1),
--			base + QUADSPI_LUT(lut_base));
--
--	/* Write disable */
--	lut_base = SEQID_WRDI * 4;
--	qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_WRDI),
--			base + QUADSPI_LUT(lut_base));
--
--	/* Enter 4 Byte Mode (Micron) */
--	lut_base = SEQID_EN4B * 4;
--	qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_EN4B),
--			base + QUADSPI_LUT(lut_base));
--
--	/* Enter 4 Byte Mode (Spansion) */
--	lut_base = SEQID_BRWR * 4;
--	qspi_writel(q, LUT0(CMD, PAD1, SPINOR_OP_BRWR),
--			base + QUADSPI_LUT(lut_base));
--
--	fsl_qspi_lock_lut(q);
--}
--
--/* Get the SEQID for the command */
--static int fsl_qspi_get_seqid(struct fsl_qspi *q, u8 cmd)
--{
--	switch (cmd) {
--	case SPINOR_OP_READ_1_1_4:
--	case SPINOR_OP_READ_1_1_4_4B:
--		return SEQID_READ;
--	case SPINOR_OP_WREN:
--		return SEQID_WREN;
--	case SPINOR_OP_WRDI:
--		return SEQID_WRDI;
--	case SPINOR_OP_RDSR:
--		return SEQID_RDSR;
--	case SPINOR_OP_SE:
--		return SEQID_SE;
--	case SPINOR_OP_CHIP_ERASE:
--		return SEQID_CHIP_ERASE;
--	case SPINOR_OP_PP:
--		return SEQID_PP;
--	case SPINOR_OP_RDID:
--		return SEQID_RDID;
--	case SPINOR_OP_WRSR:
--		return SEQID_WRSR;
--	case SPINOR_OP_RDCR:
--		return SEQID_RDCR;
--	case SPINOR_OP_EN4B:
--		return SEQID_EN4B;
--	case SPINOR_OP_BRWR:
--		return SEQID_BRWR;
--	default:
--		if (cmd == q->nor[0].erase_opcode)
--			return SEQID_SE;
--		dev_err(q->dev, "Unsupported cmd 0x%.2x\n", cmd);
--		break;
--	}
--	return -EINVAL;
--}
--
--static int
--fsl_qspi_runcmd(struct fsl_qspi *q, u8 cmd, unsigned int addr, int len)
--{
--	void __iomem *base = q->iobase;
--	int seqid;
--	u32 reg, reg2;
--	int err;
--
--	init_completion(&q->c);
--	dev_dbg(q->dev, "to 0x%.8x:0x%.8x, len:%d, cmd:%.2x\n",
--			q->chip_base_addr, addr, len, cmd);
--
--	/* save the reg */
--	reg = qspi_readl(q, base + QUADSPI_MCR);
--
--	qspi_writel(q, q->memmap_phy + q->chip_base_addr + addr,
--			base + QUADSPI_SFAR);
--	qspi_writel(q, QUADSPI_RBCT_WMRK_MASK | QUADSPI_RBCT_RXBRD_USEIPS,
--			base + QUADSPI_RBCT);
--	qspi_writel(q, reg | QUADSPI_MCR_CLR_RXF_MASK, base + QUADSPI_MCR);
--
--	do {
--		reg2 = qspi_readl(q, base + QUADSPI_SR);
--		if (reg2 & (QUADSPI_SR_IP_ACC_MASK | QUADSPI_SR_AHB_ACC_MASK)) {
--			udelay(1);
--			dev_dbg(q->dev, "The controller is busy, 0x%x\n", reg2);
--			continue;
--		}
--		break;
--	} while (1);
--
--	/* trigger the LUT now */
--	seqid = fsl_qspi_get_seqid(q, cmd);
--	if (seqid < 0)
--		return seqid;
--
--	qspi_writel(q, (seqid << QUADSPI_IPCR_SEQID_SHIFT) | len,
--			base + QUADSPI_IPCR);
--
--	/* Wait for the interrupt. */
--	if (!wait_for_completion_timeout(&q->c, msecs_to_jiffies(1000))) {
--		dev_err(q->dev,
--			"cmd 0x%.2x timeout, addr@%.8x, FR:0x%.8x, SR:0x%.8x\n",
--			cmd, addr, qspi_readl(q, base + QUADSPI_FR),
--			qspi_readl(q, base + QUADSPI_SR));
--		err = -ETIMEDOUT;
--	} else {
--		err = 0;
--	}
--
--	/* restore the MCR */
--	qspi_writel(q, reg, base + QUADSPI_MCR);
--
--	return err;
--}
--
--/* Read out the data from the QUADSPI_RBDR buffer registers. */
--static void fsl_qspi_read_data(struct fsl_qspi *q, int len, u8 *rxbuf)
--{
--	u32 tmp;
--	int i = 0;
--
--	while (len > 0) {
--		tmp = qspi_readl(q, q->iobase + QUADSPI_RBDR + i * 4);
--		tmp = fsl_qspi_endian_xchg(q, tmp);
--		dev_dbg(q->dev, "chip addr:0x%.8x, rcv:0x%.8x\n",
--				q->chip_base_addr, tmp);
--
--		if (len >= 4) {
--			*((u32 *)rxbuf) = tmp;
--			rxbuf += 4;
--		} else {
--			memcpy(rxbuf, &tmp, len);
--			break;
--		}
--
--		len -= 4;
--		i++;
--	}
--}
--
--/*
-- * If we have changed the content of the flash by writing or erasing,
-- * we need to invalidate the AHB buffer. If we do not do so, we may read out
-- * the wrong data. The spec tells us reset the AHB domain and Serial Flash
-- * domain at the same time.
-- */
--static inline void fsl_qspi_invalid(struct fsl_qspi *q)
--{
--	u32 reg;
--
--	reg = qspi_readl(q, q->iobase + QUADSPI_MCR);
--	reg |= QUADSPI_MCR_SWRSTHD_MASK | QUADSPI_MCR_SWRSTSD_MASK;
--	qspi_writel(q, reg, q->iobase + QUADSPI_MCR);
--
--	/*
--	 * The minimum delay : 1 AHB + 2 SFCK clocks.
--	 * Delay 1 us is enough.
--	 */
--	udelay(1);
--
--	reg &= ~(QUADSPI_MCR_SWRSTHD_MASK | QUADSPI_MCR_SWRSTSD_MASK);
--	qspi_writel(q, reg, q->iobase + QUADSPI_MCR);
--}
--
--static ssize_t fsl_qspi_nor_write(struct fsl_qspi *q, struct spi_nor *nor,
--				u8 opcode, unsigned int to, u32 *txbuf,
--				unsigned count)
--{
--	int ret, i, j;
--	u32 tmp;
--
--	dev_dbg(q->dev, "to 0x%.8x:0x%.8x, len : %d\n",
--		q->chip_base_addr, to, count);
--
--	/* clear the TX FIFO. */
--	tmp = qspi_readl(q, q->iobase + QUADSPI_MCR);
--	qspi_writel(q, tmp | QUADSPI_MCR_CLR_TXF_MASK, q->iobase + QUADSPI_MCR);
--
--	/* fill the TX data to the FIFO */
--	for (j = 0, i = ((count + 3) / 4); j < i; j++) {
--		tmp = fsl_qspi_endian_xchg(q, *txbuf);
--		qspi_writel(q, tmp, q->iobase + QUADSPI_TBDR);
--		txbuf++;
--	}
--
--	/* fill the TXFIFO upto 16 bytes for i.MX7d */
--	if (needs_fill_txfifo(q))
--		for (; i < 4; i++)
--			qspi_writel(q, tmp, q->iobase + QUADSPI_TBDR);
--
--	/* Trigger it */
--	ret = fsl_qspi_runcmd(q, opcode, to, count);
--
--	if (ret == 0)
--		return count;
--
--	return ret;
--}
--
--static void fsl_qspi_set_map_addr(struct fsl_qspi *q)
--{
--	int nor_size = q->nor_size;
--	void __iomem *base = q->iobase;
--
--	qspi_writel(q, nor_size + q->memmap_phy, base + QUADSPI_SFA1AD);
--	qspi_writel(q, nor_size * 2 + q->memmap_phy, base + QUADSPI_SFA2AD);
--	qspi_writel(q, nor_size * 3 + q->memmap_phy, base + QUADSPI_SFB1AD);
--	qspi_writel(q, nor_size * 4 + q->memmap_phy, base + QUADSPI_SFB2AD);
--}
--
--/*
-- * There are two different ways to read out the data from the flash:
-- *  the "IP Command Read" and the "AHB Command Read".
-- *
-- * The IC guy suggests we use the "AHB Command Read" which is faster
-- * then the "IP Command Read". (What's more is that there is a bug in
-- * the "IP Command Read" in the Vybrid.)
-- *
-- * After we set up the registers for the "AHB Command Read", we can use
-- * the memcpy to read the data directly. A "missed" access to the buffer
-- * causes the controller to clear the buffer, and use the sequence pointed
-- * by the QUADSPI_BFGENCR[SEQID] to initiate a read from the flash.
-- */
--static int fsl_qspi_init_ahb_read(struct fsl_qspi *q)
--{
--	void __iomem *base = q->iobase;
--	int seqid;
--
--	/* AHB configuration for access buffer 0/1/2 .*/
--	qspi_writel(q, QUADSPI_BUFXCR_INVALID_MSTRID, base + QUADSPI_BUF0CR);
--	qspi_writel(q, QUADSPI_BUFXCR_INVALID_MSTRID, base + QUADSPI_BUF1CR);
--	qspi_writel(q, QUADSPI_BUFXCR_INVALID_MSTRID, base + QUADSPI_BUF2CR);
--	/*
--	 * Set ADATSZ with the maximum AHB buffer size to improve the
--	 * read performance.
--	 */
--	qspi_writel(q, QUADSPI_BUF3CR_ALLMST_MASK |
--			((q->devtype_data->ahb_buf_size / 8)
--			<< QUADSPI_BUF3CR_ADATSZ_SHIFT),
--			base + QUADSPI_BUF3CR);
--
--	/* We only use the buffer3 */
--	qspi_writel(q, 0, base + QUADSPI_BUF0IND);
--	qspi_writel(q, 0, base + QUADSPI_BUF1IND);
--	qspi_writel(q, 0, base + QUADSPI_BUF2IND);
--
--	/* Set the default lut sequence for AHB Read. */
--	seqid = fsl_qspi_get_seqid(q, q->nor[0].read_opcode);
--	if (seqid < 0)
--		return seqid;
--
--	qspi_writel(q, seqid << QUADSPI_BFGENCR_SEQID_SHIFT,
--		q->iobase + QUADSPI_BFGENCR);
--
--	return 0;
--}
--
--/* This function was used to prepare and enable QSPI clock */
--static int fsl_qspi_clk_prep_enable(struct fsl_qspi *q)
--{
--	int ret;
--
--	ret = clk_prepare_enable(q->clk_en);
--	if (ret)
--		return ret;
--
--	ret = clk_prepare_enable(q->clk);
--	if (ret) {
--		clk_disable_unprepare(q->clk_en);
--		return ret;
--	}
--
--	if (needs_wakeup_wait_mode(q))
--		pm_qos_add_request(&q->pm_qos_req, PM_QOS_CPU_DMA_LATENCY, 0);
--
--	return 0;
--}
--
--/* This function was used to disable and unprepare QSPI clock */
--static void fsl_qspi_clk_disable_unprep(struct fsl_qspi *q)
--{
--	if (needs_wakeup_wait_mode(q))
--		pm_qos_remove_request(&q->pm_qos_req);
--
--	clk_disable_unprepare(q->clk);
--	clk_disable_unprepare(q->clk_en);
--
--}
--
--/* We use this function to do some basic init for spi_nor_scan(). */
--static int fsl_qspi_nor_setup(struct fsl_qspi *q)
--{
--	void __iomem *base = q->iobase;
--	u32 reg;
--	int ret;
--
--	/* disable and unprepare clock to avoid glitch pass to controller */
--	fsl_qspi_clk_disable_unprep(q);
--
--	/* the default frequency, we will change it in the future. */
--	ret = clk_set_rate(q->clk, 66000000);
--	if (ret)
--		return ret;
--
--	ret = fsl_qspi_clk_prep_enable(q);
--	if (ret)
--		return ret;
--
--	/* Reset the module */
--	qspi_writel(q, QUADSPI_MCR_SWRSTSD_MASK | QUADSPI_MCR_SWRSTHD_MASK,
--		base + QUADSPI_MCR);
--	udelay(1);
--
--	/* Init the LUT table. */
--	fsl_qspi_init_lut(q);
--
--	/* Disable the module */
--	qspi_writel(q, QUADSPI_MCR_MDIS_MASK | QUADSPI_MCR_RESERVED_MASK,
--			base + QUADSPI_MCR);
--
--	reg = qspi_readl(q, base + QUADSPI_SMPR);
--	qspi_writel(q, reg & ~(QUADSPI_SMPR_FSDLY_MASK
--			| QUADSPI_SMPR_FSPHS_MASK
--			| QUADSPI_SMPR_HSENA_MASK
--			| QUADSPI_SMPR_DDRSMP_MASK), base + QUADSPI_SMPR);
--
--	/* Enable the module */
--	qspi_writel(q, QUADSPI_MCR_RESERVED_MASK | QUADSPI_MCR_END_CFG_MASK,
--			base + QUADSPI_MCR);
--
--	/* clear all interrupt status */
--	qspi_writel(q, 0xffffffff, q->iobase + QUADSPI_FR);
--
--	/* enable the interrupt */
--	qspi_writel(q, QUADSPI_RSER_TFIE, q->iobase + QUADSPI_RSER);
--
--	return 0;
--}
--
--static int fsl_qspi_nor_setup_last(struct fsl_qspi *q)
--{
--	unsigned long rate = q->clk_rate;
--	int ret;
--
--	if (needs_4x_clock(q))
--		rate *= 4;
--
--	/* disable and unprepare clock to avoid glitch pass to controller */
--	fsl_qspi_clk_disable_unprep(q);
--
--	ret = clk_set_rate(q->clk, rate);
--	if (ret)
--		return ret;
--
--	ret = fsl_qspi_clk_prep_enable(q);
--	if (ret)
--		return ret;
--
--	/* Init the LUT table again. */
--	fsl_qspi_init_lut(q);
--
--	/* Init for AHB read */
--	return fsl_qspi_init_ahb_read(q);
--}
--
--static const struct of_device_id fsl_qspi_dt_ids[] = {
--	{ .compatible = "fsl,vf610-qspi", .data = &vybrid_data, },
--	{ .compatible = "fsl,imx6sx-qspi", .data = &imx6sx_data, },
--	{ .compatible = "fsl,imx7d-qspi", .data = &imx7d_data, },
--	{ .compatible = "fsl,imx6ul-qspi", .data = &imx6ul_data, },
--	{ .compatible = "fsl,ls1021a-qspi", .data = (void *)&ls1021a_data, },
--	{ .compatible = "fsl,ls2080a-qspi", .data = &ls2080a_data, },
--	{ /* sentinel */ }
--};
--MODULE_DEVICE_TABLE(of, fsl_qspi_dt_ids);
--
--static void fsl_qspi_set_base_addr(struct fsl_qspi *q, struct spi_nor *nor)
--{
--	q->chip_base_addr = q->nor_size * (nor - q->nor);
--}
--
--static int fsl_qspi_read_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len)
--{
--	int ret;
--	struct fsl_qspi *q = nor->priv;
--
--	ret = fsl_qspi_runcmd(q, opcode, 0, len);
--	if (ret)
--		return ret;
--
--	fsl_qspi_read_data(q, len, buf);
--	return 0;
--}
--
--static int fsl_qspi_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len)
--{
--	struct fsl_qspi *q = nor->priv;
--	int ret;
--
--	if (!buf) {
--		ret = fsl_qspi_runcmd(q, opcode, 0, 1);
--		if (ret)
--			return ret;
--
--		if (opcode == SPINOR_OP_CHIP_ERASE)
--			fsl_qspi_invalid(q);
--
--	} else if (len > 0) {
--		ret = fsl_qspi_nor_write(q, nor, opcode, 0,
--					(u32 *)buf, len);
--		if (ret > 0)
--			return 0;
--	} else {
--		dev_err(q->dev, "invalid cmd %d\n", opcode);
--		ret = -EINVAL;
--	}
--
--	return ret;
--}
--
--static ssize_t fsl_qspi_write(struct spi_nor *nor, loff_t to,
--			      size_t len, const u_char *buf)
--{
--	struct fsl_qspi *q = nor->priv;
--	ssize_t ret = fsl_qspi_nor_write(q, nor, nor->program_opcode, to,
--					 (u32 *)buf, len);
--
--	/* invalid the data in the AHB buffer. */
--	fsl_qspi_invalid(q);
--	return ret;
--}
--
--static ssize_t fsl_qspi_read(struct spi_nor *nor, loff_t from,
--			     size_t len, u_char *buf)
--{
--	struct fsl_qspi *q = nor->priv;
--	u8 cmd = nor->read_opcode;
--
--	/* if necessary,ioremap buffer before AHB read, */
--	if (!q->ahb_addr) {
--		q->memmap_offs = q->chip_base_addr + from;
--		q->memmap_len = len > QUADSPI_MIN_IOMAP ? len : QUADSPI_MIN_IOMAP;
--
--		q->ahb_addr = ioremap_nocache(
--				q->memmap_phy + q->memmap_offs,
--				q->memmap_len);
--		if (!q->ahb_addr) {
--			dev_err(q->dev, "ioremap failed\n");
--			return -ENOMEM;
--		}
--	/* ioremap if the data requested is out of range */
--	} else if (q->chip_base_addr + from < q->memmap_offs
--			|| q->chip_base_addr + from + len >
--			q->memmap_offs + q->memmap_len) {
--		iounmap(q->ahb_addr);
--
--		q->memmap_offs = q->chip_base_addr + from;
--		q->memmap_len = len > QUADSPI_MIN_IOMAP ? len : QUADSPI_MIN_IOMAP;
--		q->ahb_addr = ioremap_nocache(
--				q->memmap_phy + q->memmap_offs,
--				q->memmap_len);
--		if (!q->ahb_addr) {
--			dev_err(q->dev, "ioremap failed\n");
--			return -ENOMEM;
--		}
--	}
--
--	dev_dbg(q->dev, "cmd [%x],read from %p, len:%zd\n",
--		cmd, q->ahb_addr + q->chip_base_addr + from - q->memmap_offs,
--		len);
--
--	/* Read out the data directly from the AHB buffer.*/
--	memcpy(buf, q->ahb_addr + q->chip_base_addr + from - q->memmap_offs,
--		len);
--
--	return len;
--}
--
--static int fsl_qspi_erase(struct spi_nor *nor, loff_t offs)
--{
--	struct fsl_qspi *q = nor->priv;
--	int ret;
--
--	dev_dbg(nor->dev, "%dKiB at 0x%08x:0x%08x\n",
--		nor->mtd.erasesize / 1024, q->chip_base_addr, (u32)offs);
--
--	ret = fsl_qspi_runcmd(q, nor->erase_opcode, offs, 0);
--	if (ret)
--		return ret;
--
--	fsl_qspi_invalid(q);
--	return 0;
--}
--
--static int fsl_qspi_prep(struct spi_nor *nor, enum spi_nor_ops ops)
--{
--	struct fsl_qspi *q = nor->priv;
--	int ret;
--
--	mutex_lock(&q->lock);
--
--	ret = fsl_qspi_clk_prep_enable(q);
--	if (ret)
--		goto err_mutex;
--
--	fsl_qspi_set_base_addr(q, nor);
--	return 0;
--
--err_mutex:
--	mutex_unlock(&q->lock);
--	return ret;
--}
--
--static void fsl_qspi_unprep(struct spi_nor *nor, enum spi_nor_ops ops)
--{
--	struct fsl_qspi *q = nor->priv;
--
--	fsl_qspi_clk_disable_unprep(q);
--	mutex_unlock(&q->lock);
--}
--
--static int fsl_qspi_probe(struct platform_device *pdev)
--{
--	const struct spi_nor_hwcaps hwcaps = {
--		.mask = SNOR_HWCAPS_READ_1_1_4 |
--			SNOR_HWCAPS_PP,
--	};
--	struct device_node *np = pdev->dev.of_node;
--	struct device *dev = &pdev->dev;
--	struct fsl_qspi *q;
--	struct resource *res;
--	struct spi_nor *nor;
--	struct mtd_info *mtd;
--	int ret, i = 0;
--
--	q = devm_kzalloc(dev, sizeof(*q), GFP_KERNEL);
--	if (!q)
--		return -ENOMEM;
--
--	q->nor_num = of_get_child_count(dev->of_node);
--	if (!q->nor_num || q->nor_num > FSL_QSPI_MAX_CHIP)
--		return -ENODEV;
--
--	q->dev = dev;
--	q->devtype_data = of_device_get_match_data(dev);
--	if (!q->devtype_data)
--		return -ENODEV;
--	platform_set_drvdata(pdev, q);
--
--	/* find the resources */
--	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "QuadSPI");
--	q->iobase = devm_ioremap_resource(dev, res);
--	if (IS_ERR(q->iobase))
--		return PTR_ERR(q->iobase);
--
--	q->big_endian = of_property_read_bool(np, "big-endian");
--	res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
--					"QuadSPI-memory");
--	if (!devm_request_mem_region(dev, res->start, resource_size(res),
--				     res->name)) {
--		dev_err(dev, "can't request region for resource %pR\n", res);
--		return -EBUSY;
--	}
--
--	q->memmap_phy = res->start;
--
--	/* find the clocks */
--	q->clk_en = devm_clk_get(dev, "qspi_en");
--	if (IS_ERR(q->clk_en))
--		return PTR_ERR(q->clk_en);
--
--	q->clk = devm_clk_get(dev, "qspi");
--	if (IS_ERR(q->clk))
--		return PTR_ERR(q->clk);
--
--	ret = fsl_qspi_clk_prep_enable(q);
--	if (ret) {
--		dev_err(dev, "can not enable the clock\n");
--		goto clk_failed;
--	}
--
--	/* find the irq */
--	ret = platform_get_irq(pdev, 0);
--	if (ret < 0) {
--		dev_err(dev, "failed to get the irq: %d\n", ret);
--		goto irq_failed;
--	}
--
--	ret = devm_request_irq(dev, ret,
--			fsl_qspi_irq_handler, 0, pdev->name, q);
--	if (ret) {
--		dev_err(dev, "failed to request irq: %d\n", ret);
--		goto irq_failed;
--	}
--
--	ret = fsl_qspi_nor_setup(q);
--	if (ret)
--		goto irq_failed;
--
--	if (of_get_property(np, "fsl,qspi-has-second-chip", NULL))
--		q->has_second_chip = true;
--
--	mutex_init(&q->lock);
--
--	/* iterate the subnodes. */
--	for_each_available_child_of_node(dev->of_node, np) {
--		/* skip the holes */
--		if (!q->has_second_chip)
--			i *= 2;
--
--		nor = &q->nor[i];
--		mtd = &nor->mtd;
--
--		nor->dev = dev;
--		spi_nor_set_flash_node(nor, np);
--		nor->priv = q;
--
--		if (q->nor_num > 1 && !mtd->name) {
--			int spiflash_idx;
--
--			ret = of_property_read_u32(np, "reg", &spiflash_idx);
--			if (!ret) {
--				mtd->name = devm_kasprintf(dev, GFP_KERNEL,
--							   "%s-%d",
--							   dev_name(dev),
--							   spiflash_idx);
--				if (!mtd->name) {
--					ret = -ENOMEM;
--					goto mutex_failed;
--				}
--			} else {
--				dev_warn(dev, "reg property is missing\n");
--			}
--		}
--
--		/* fill the hooks */
--		nor->read_reg = fsl_qspi_read_reg;
--		nor->write_reg = fsl_qspi_write_reg;
--		nor->read = fsl_qspi_read;
--		nor->write = fsl_qspi_write;
--		nor->erase = fsl_qspi_erase;
--
--		nor->prepare = fsl_qspi_prep;
--		nor->unprepare = fsl_qspi_unprep;
--
--		ret = of_property_read_u32(np, "spi-max-frequency",
--				&q->clk_rate);
--		if (ret < 0)
--			goto mutex_failed;
--
--		/* set the chip address for READID */
--		fsl_qspi_set_base_addr(q, nor);
--
--		ret = spi_nor_scan(nor, NULL, &hwcaps);
--		if (ret)
--			goto mutex_failed;
--
--		ret = mtd_device_register(mtd, NULL, 0);
--		if (ret)
--			goto mutex_failed;
--
--		/* Set the correct NOR size now. */
--		if (q->nor_size == 0) {
--			q->nor_size = mtd->size;
--
--			/* Map the SPI NOR to accessiable address */
--			fsl_qspi_set_map_addr(q);
--		}
--
--		/*
--		 * The TX FIFO is 64 bytes in the Vybrid, but the Page Program
--		 * may writes 265 bytes per time. The write is working in the
--		 * unit of the TX FIFO, not in the unit of the SPI NOR's page
--		 * size.
--		 *
--		 * So shrink the spi_nor->page_size if it is larger then the
--		 * TX FIFO.
--		 */
--		if (nor->page_size > q->devtype_data->txfifo)
--			nor->page_size = q->devtype_data->txfifo;
--
--		i++;
--	}
--
--	/* finish the rest init. */
--	ret = fsl_qspi_nor_setup_last(q);
--	if (ret)
--		goto last_init_failed;
--
--	fsl_qspi_clk_disable_unprep(q);
--	return 0;
--
--last_init_failed:
--	for (i = 0; i < q->nor_num; i++) {
--		/* skip the holes */
--		if (!q->has_second_chip)
--			i *= 2;
--		mtd_device_unregister(&q->nor[i].mtd);
--	}
--mutex_failed:
--	mutex_destroy(&q->lock);
--irq_failed:
--	fsl_qspi_clk_disable_unprep(q);
--clk_failed:
--	dev_err(dev, "Freescale QuadSPI probe failed\n");
--	return ret;
--}
--
--static int fsl_qspi_remove(struct platform_device *pdev)
--{
--	struct fsl_qspi *q = platform_get_drvdata(pdev);
--	int i;
--
--	for (i = 0; i < q->nor_num; i++) {
--		/* skip the holes */
--		if (!q->has_second_chip)
--			i *= 2;
--		mtd_device_unregister(&q->nor[i].mtd);
--	}
--
--	/* disable the hardware */
--	qspi_writel(q, QUADSPI_MCR_MDIS_MASK, q->iobase + QUADSPI_MCR);
--	qspi_writel(q, 0x0, q->iobase + QUADSPI_RSER);
--
--	mutex_destroy(&q->lock);
--
--	if (q->ahb_addr)
--		iounmap(q->ahb_addr);
--
--	return 0;
--}
--
--static int fsl_qspi_suspend(struct platform_device *pdev, pm_message_t state)
--{
--	return 0;
--}
--
--static int fsl_qspi_resume(struct platform_device *pdev)
--{
--	int ret;
--	struct fsl_qspi *q = platform_get_drvdata(pdev);
--
--	ret = fsl_qspi_clk_prep_enable(q);
--	if (ret)
--		return ret;
--
--	fsl_qspi_nor_setup(q);
--	fsl_qspi_set_map_addr(q);
--	fsl_qspi_nor_setup_last(q);
--
--	fsl_qspi_clk_disable_unprep(q);
--
--	return 0;
--}
--
--static struct platform_driver fsl_qspi_driver = {
--	.driver = {
--		.name	= "fsl-quadspi",
--		.of_match_table = fsl_qspi_dt_ids,
--	},
--	.probe          = fsl_qspi_probe,
--	.remove		= fsl_qspi_remove,
--	.suspend	= fsl_qspi_suspend,
--	.resume		= fsl_qspi_resume,
--};
--module_platform_driver(fsl_qspi_driver);
--
--MODULE_DESCRIPTION("Freescale QuadSPI Controller Driver");
--MODULE_AUTHOR("Freescale Semiconductor Inc.");
--MODULE_LICENSE("GPL v2");
 diff --git a/drivers/pinctrl/pinctrl-mcp23s08.c b/drivers/pinctrl/pinctrl-mcp23s08.c
-index 98905d4a79ca..dac31601fc53 100644
+index 3a235487e38d..3358891b3ea2 100644
 --- a/drivers/pinctrl/pinctrl-mcp23s08.c
 +++ b/drivers/pinctrl/pinctrl-mcp23s08.c
-@@ -68,6 +68,7 @@ struct mcp23s08 {
- 	struct mutex		lock;
- 
- 	struct gpio_chip	chip;
-+	struct irq_chip		irq_chip;
- 
- 	struct regmap		*regmap;
- 	struct device		*dev;
-@@ -265,7 +266,6 @@ static int mcp_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
- 		status = (data & BIT(pin)) ? 1 : 0;
- 		break;
- 	default:
--		dev_err(mcp->dev, "Invalid config param %04x\n", param);
- 		return -ENOTSUPP;
- 	}
- 
-@@ -292,7 +292,7 @@ static int mcp_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
- 			ret = mcp_set_bit(mcp, MCP_GPPU, pin, arg);
- 			break;
- 		default:
--			dev_err(mcp->dev, "Invalid config param %04x\n", param);
-+			dev_dbg(mcp->dev, "Invalid config param %04x\n", param);
- 			return -ENOTSUPP;
- 		}
- 	}
-@@ -607,15 +607,6 @@ static void mcp23s08_irq_bus_unlock(struct irq_data *data)
- 	mutex_unlock(&mcp->lock);
- }
- 
--static struct irq_chip mcp23s08_irq_chip = {
--	.name = "gpio-mcp23xxx",
--	.irq_mask = mcp23s08_irq_mask,
--	.irq_unmask = mcp23s08_irq_unmask,
--	.irq_set_type = mcp23s08_irq_set_type,
--	.irq_bus_lock = mcp23s08_irq_bus_lock,
--	.irq_bus_sync_unlock = mcp23s08_irq_bus_unlock,
--};
--
- static int mcp23s08_irq_setup(struct mcp23s08 *mcp)
- {
- 	struct gpio_chip *chip = &mcp->chip;
-@@ -645,7 +636,7 @@ static int mcp23s08_irqchip_setup(struct mcp23s08 *mcp)
- 	int err;
- 
- 	err =  gpiochip_irqchip_add_nested(chip,
--					   &mcp23s08_irq_chip,
-+					   &mcp->irq_chip,
- 					   0,
- 					   handle_simple_irq,
- 					   IRQ_TYPE_NONE);
-@@ -656,7 +647,7 @@ static int mcp23s08_irqchip_setup(struct mcp23s08 *mcp)
- 	}
- 
- 	gpiochip_set_nested_irqchip(chip,
--				    &mcp23s08_irq_chip,
-+				    &mcp->irq_chip,
- 				    mcp->irq);
- 
- 	return 0;
-@@ -664,115 +655,6 @@ static int mcp23s08_irqchip_setup(struct mcp23s08 *mcp)
- 
- /*----------------------------------------------------------------------*/
- 
--#ifdef CONFIG_DEBUG_FS
--
--#include <linux/seq_file.h>
--
--/*
-- * This compares the chip's registers with the register
-- * cache and corrects any incorrectly set register. This
-- * can be used to fix state for MCP23xxx, that temporary
-- * lost its power supply.
-- */
--#define MCP23S08_CONFIG_REGS 7
--static int __check_mcp23s08_reg_cache(struct mcp23s08 *mcp)
--{
--	int cached[MCP23S08_CONFIG_REGS];
--	int err = 0, i;
--
--	/* read cached config registers */
--	for (i = 0; i < MCP23S08_CONFIG_REGS; i++) {
--		err = mcp_read(mcp, i, &cached[i]);
--		if (err)
--			goto out;
--	}
--
--	regcache_cache_bypass(mcp->regmap, true);
--
--	for (i = 0; i < MCP23S08_CONFIG_REGS; i++) {
--		int uncached;
--		err = mcp_read(mcp, i, &uncached);
--		if (err)
--			goto out;
--
--		if (uncached != cached[i]) {
--			dev_err(mcp->dev, "restoring reg 0x%02x from 0x%04x to 0x%04x (power-loss?)\n",
--				i, uncached, cached[i]);
--			mcp_write(mcp, i, cached[i]);
--		}
--	}
--
--out:
--	if (err)
--		dev_err(mcp->dev, "read error: reg=%02x, err=%d", i, err);
--	regcache_cache_bypass(mcp->regmap, false);
--	return err;
--}
--
--/*
-- * This shows more info than the generic gpio dump code:
-- * pullups, deglitching, open drain drive.
-- */
--static void mcp23s08_dbg_show(struct seq_file *s, struct gpio_chip *chip)
--{
--	struct mcp23s08	*mcp;
--	char		bank;
--	int		t;
--	unsigned	mask;
--	int iodir, gpio, gppu;
--
--	mcp = gpiochip_get_data(chip);
--
--	/* NOTE: we only handle one bank for now ... */
--	bank = '0' + ((mcp->addr >> 1) & 0x7);
--
--	mutex_lock(&mcp->lock);
--
--	t = __check_mcp23s08_reg_cache(mcp);
--	if (t) {
--		seq_printf(s, " I/O Error\n");
--		goto done;
--	}
--	t = mcp_read(mcp, MCP_IODIR, &iodir);
--	if (t) {
--		seq_printf(s, " I/O Error\n");
--		goto done;
--	}
--	t = mcp_read(mcp, MCP_GPIO, &gpio);
--	if (t) {
--		seq_printf(s, " I/O Error\n");
--		goto done;
--	}
--	t = mcp_read(mcp, MCP_GPPU, &gppu);
--	if (t) {
--		seq_printf(s, " I/O Error\n");
--		goto done;
--	}
--
--	for (t = 0, mask = BIT(0); t < chip->ngpio; t++, mask <<= 1) {
--		const char *label;
--
--		label = gpiochip_is_requested(chip, t);
--		if (!label)
--			continue;
--
--		seq_printf(s, " gpio-%-3d P%c.%d (%-12s) %s %s %s\n",
--			   chip->base + t, bank, t, label,
--			   (iodir & mask) ? "in " : "out",
--			   (gpio & mask) ? "hi" : "lo",
--			   (gppu & mask) ? "up" : "  ");
--		/* NOTE:  ignoring the irq-related registers */
--	}
--done:
--	mutex_unlock(&mcp->lock);
--}
--
--#else
--#define mcp23s08_dbg_show	NULL
--#endif
--
--/*----------------------------------------------------------------------*/
--
- static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
- 			      void *data, unsigned addr, unsigned type,
- 			      unsigned int base, int cs)
-@@ -793,7 +675,6 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
- 	mcp->chip.get = mcp23s08_get;
- 	mcp->chip.direction_output = mcp23s08_direction_output;
- 	mcp->chip.set = mcp23s08_set;
--	mcp->chip.dbg_show = mcp23s08_dbg_show;
- #ifdef CONFIG_OF_GPIO
- 	mcp->chip.of_gpio_n_cells = 2;
- 	mcp->chip.of_node = dev->of_node;
-@@ -1047,6 +928,13 @@ static int mcp230xx_probe(struct i2c_client *client,
- 		return -ENOMEM;
- 
- 	mcp->irq = client->irq;
-+	mcp->irq_chip.name = dev_name(&client->dev);
-+	mcp->irq_chip.irq_mask = mcp23s08_irq_mask;
-+	mcp->irq_chip.irq_unmask = mcp23s08_irq_unmask;
-+	mcp->irq_chip.irq_set_type = mcp23s08_irq_set_type;
-+	mcp->irq_chip.irq_bus_lock = mcp23s08_irq_bus_lock;
-+	mcp->irq_chip.irq_bus_sync_unlock = mcp23s08_irq_bus_unlock;
-+
- 	status = mcp23s08_probe_one(mcp, &client->dev, client, client->addr,
- 				    id->driver_data, pdata->base, 0);
- 	if (status)
-@@ -1104,6 +992,7 @@ static int mcp23s08_probe(struct spi_device *spi)
+@@ -993,6 +993,7 @@ static int mcp23s08_probe(struct spi_device *spi)
  	int				status, type;
  	unsigned			ngpio = 0;
  	const struct			of_device_id *match;
@@ -2327,31 +122,7 @@
  
  	match = of_match_device(of_match_ptr(mcp23s08_spi_of_match), &spi->dev);
  	if (match)
-@@ -1144,8 +1033,7 @@ static int mcp23s08_probe(struct spi_device *spi)
- 		return -ENODEV;
- 
- 	data = devm_kzalloc(&spi->dev,
--			    sizeof(*data) + chips * sizeof(struct mcp23s08),
--			    GFP_KERNEL);
-+			    struct_size(data, chip, chips), GFP_KERNEL);
- 	if (!data)
- 		return -ENOMEM;
- 
-@@ -1157,6 +1045,13 @@ static int mcp23s08_probe(struct spi_device *spi)
- 		chips--;
- 		data->mcp[addr] = &data->chip[chips];
- 		data->mcp[addr]->irq = spi->irq;
-+		data->mcp[addr]->irq_chip.name = dev_name(&spi->dev);
-+		data->mcp[addr]->irq_chip.irq_mask = mcp23s08_irq_mask;
-+		data->mcp[addr]->irq_chip.irq_unmask = mcp23s08_irq_unmask;
-+		data->mcp[addr]->irq_chip.irq_set_type = mcp23s08_irq_set_type;
-+		data->mcp[addr]->irq_chip.irq_bus_lock = mcp23s08_irq_bus_lock;
-+		data->mcp[addr]->irq_chip.irq_bus_sync_unlock =
-+			mcp23s08_irq_bus_unlock;
- 		status = mcp23s08_probe_one(data->mcp[addr], &spi->dev, spi,
- 					    0x40 | (addr << 1), type,
- 					    pdata->base, addr);
-@@ -1166,6 +1061,16 @@ static int mcp23s08_probe(struct spi_device *spi)
+@@ -1061,6 +1062,16 @@ static int mcp23s08_probe(struct spi_device *spi)
  		if (pdata->base != -1)
  			pdata->base += data->mcp[addr]->chip.ngpio;
  		ngpio += data->mcp[addr]->chip.ngpio;
@@ -2368,4146 +139,11 @@
  	}
  	data->ngpio = ngpio;
  
-diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
-index 9f89cb134549..f761655e2a36 100644
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -63,7 +63,7 @@ config SPI_ALTERA
- 
- config SPI_ATH79
- 	tristate "Atheros AR71XX/AR724X/AR913X SPI controller driver"
--	depends on ATH79 && GPIOLIB
-+	depends on ATH79 || COMPILE_TEST
- 	select SPI_BITBANG
- 	help
- 	  This enables support for the SPI controller present on the
-@@ -268,6 +268,27 @@ config SPI_FSL_LPSPI
- 	help
- 	  This enables Freescale i.MX LPSPI controllers in master mode.
- 
-+config SPI_FSL_QUADSPI
-+	tristate "Freescale QSPI controller"
-+	depends on ARCH_MXC || SOC_LS1021A || ARCH_LAYERSCAPE || COMPILE_TEST
-+	depends on HAS_IOMEM
-+	help
-+	  This enables support for the Quad SPI controller in master mode.
-+	  Up to four flash chips can be connected on two buses with two
-+	  chipselects each.
-+	  This controller does not support generic SPI messages. It only
-+	  supports the high-level SPI memory interface.
-+
-+config SPI_NXP_FLEXSPI
-+	tristate "NXP Flex SPI controller"
-+	depends on ARCH_LAYERSCAPE || HAS_IOMEM
-+	help
-+	  This enables support for the Flex SPI controller in master mode.
-+	  Up to four slave devices can be connected on two buses with two
-+	  chipselects each.
-+	  This controller does not support generic SPI messages and only
-+	  supports the high-level SPI memory interface.
-+
- config SPI_GPIO
- 	tristate "GPIO-based bitbanging SPI Master"
- 	depends on GPIOLIB || COMPILE_TEST
-@@ -296,8 +317,7 @@ config SPI_IMX
- 	depends on ARCH_MXC || COMPILE_TEST
- 	select SPI_BITBANG
- 	help
--	  This enables using the Freescale i.MX SPI controllers in master
--	  mode.
-+	  This enables support for the Freescale i.MX SPI controllers.
- 
- config SPI_JCORE
- 	tristate "J-Core SPI Master"
-@@ -372,7 +392,7 @@ config SPI_FSL_DSPI
- 	depends on SOC_VF610 || SOC_LS1021A || ARCH_LAYERSCAPE || M5441x || COMPILE_TEST
- 	help
- 	  This enables support for the Freescale DSPI controller in master
--	  mode. VF610 platform uses the controller.
-+	  mode. VF610, LS1021A and ColdFire platforms uses the controller.
- 
- config SPI_FSL_ESPI
- 	tristate "Freescale eSPI controller"
-@@ -631,6 +651,12 @@ config SPI_SH_HSPI
- 	help
- 	  SPI driver for SuperH HSPI blocks.
- 
-+config SPI_SIFIVE
-+	tristate "SiFive SPI controller"
-+	depends on HAS_IOMEM
-+	help
-+	  This exposes the SPI controller IP from SiFive.
-+
- config SPI_SIRF
- 	tristate "CSR SiRFprimaII SPI controller"
- 	depends on SIRF_DMA
-@@ -665,7 +691,7 @@ config SPI_STM32
- 	tristate "STMicroelectronics STM32 SPI controller"
- 	depends on ARCH_STM32 || COMPILE_TEST
- 	help
--	  SPI driver for STMicroelectonics STM32 SoCs.
-+	  SPI driver for STMicroelectronics STM32 SoCs.
- 
- 	  STM32 SPI controller supports DMA and PIO modes. When DMA
- 	  is not available, the driver automatically falls back to
-diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
-index f29627040dfb..d8fc03c9faa2 100644
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -45,6 +45,7 @@ obj-$(CONFIG_SPI_FSL_DSPI)		+= spi-fsl-dspi.o
- obj-$(CONFIG_SPI_FSL_LIB)		+= spi-fsl-lib.o
- obj-$(CONFIG_SPI_FSL_ESPI)		+= spi-fsl-espi.o
- obj-$(CONFIG_SPI_FSL_LPSPI)		+= spi-fsl-lpspi.o
-+obj-$(CONFIG_SPI_FSL_QUADSPI)		+= spi-fsl-qspi.o
- obj-$(CONFIG_SPI_FSL_SPI)		+= spi-fsl-spi.o
- obj-$(CONFIG_SPI_GPIO)			+= spi-gpio.o
- obj-$(CONFIG_SPI_IMG_SPFI)		+= spi-img-spfi.o
-@@ -63,6 +64,7 @@ obj-$(CONFIG_SPI_MXIC)			+= spi-mxic.o
- obj-$(CONFIG_SPI_MXS)			+= spi-mxs.o
- obj-$(CONFIG_SPI_NPCM_PSPI)		+= spi-npcm-pspi.o
- obj-$(CONFIG_SPI_NUC900)		+= spi-nuc900.o
-+obj-$(CONFIG_SPI_NXP_FLEXSPI)		+= spi-nxp-fspi.o
- obj-$(CONFIG_SPI_OC_TINY)		+= spi-oc-tiny.o
- spi-octeon-objs				:= spi-cavium.o spi-cavium-octeon.o
- obj-$(CONFIG_SPI_OCTEON)		+= spi-octeon.o
-@@ -93,6 +95,7 @@ obj-$(CONFIG_SPI_SH)			+= spi-sh.o
- obj-$(CONFIG_SPI_SH_HSPI)		+= spi-sh-hspi.o
- obj-$(CONFIG_SPI_SH_MSIOF)		+= spi-sh-msiof.o
- obj-$(CONFIG_SPI_SH_SCI)		+= spi-sh-sci.o
-+obj-$(CONFIG_SPI_SIFIVE)		+= spi-sifive.o
- obj-$(CONFIG_SPI_SIRF)		+= spi-sirf.o
- obj-$(CONFIG_SPI_SLAVE_MT27XX)          += spi-slave-mt27xx.o
- obj-$(CONFIG_SPI_SPRD)			+= spi-sprd.o
-diff --git a/drivers/spi/atmel-quadspi.c b/drivers/spi/atmel-quadspi.c
-index ddc712410812..fffc21cd5f79 100644
---- a/drivers/spi/atmel-quadspi.c
-+++ b/drivers/spi/atmel-quadspi.c
-@@ -1,3 +1,4 @@
-+// SPDX-License-Identifier: GPL-2.0
- /*
-  * Driver for Atmel QSPI Controller
-  *
-@@ -7,31 +8,19 @@
-  * Author: Cyrille Pitchen <cyrille.pitchen@atmel.com>
-  * Author: Piotr Bugalski <bugalski.piotr@gmail.com>
-  *
-- * This program is free software; you can redistribute it and/or modify
-- * it under the terms of the GNU General Public License version 2 as
-- * published by the Free Software Foundation.
-- *
-- * This program is distributed in the hope that it will be useful, but WITHOUT
-- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-- * more details.
-- *
-- * You should have received a copy of the GNU General Public License along with
-- * this program.  If not, see <http://www.gnu.org/licenses/>.
-- *
-  * This driver is based on drivers/mtd/spi-nor/fsl-quadspi.c from Freescale.
-  */
- 
--#include <linux/kernel.h>
- #include <linux/clk.h>
--#include <linux/module.h>
--#include <linux/platform_device.h>
- #include <linux/delay.h>
- #include <linux/err.h>
- #include <linux/interrupt.h>
--#include <linux/of.h>
--
- #include <linux/io.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/of.h>
-+#include <linux/of_platform.h>
-+#include <linux/platform_device.h>
- #include <linux/spi/spi-mem.h>
- 
- /* QSPI register offsets */
-@@ -47,7 +36,9 @@
- 
- #define QSPI_IAR     0x0030  /* Instruction Address Register */
- #define QSPI_ICR     0x0034  /* Instruction Code Register */
-+#define QSPI_WICR    0x0034  /* Write Instruction Code Register */
- #define QSPI_IFR     0x0038  /* Instruction Frame Register */
-+#define QSPI_RICR    0x003C  /* Read Instruction Code Register */
- 
- #define QSPI_SMR     0x0040  /* Scrambling Mode Register */
- #define QSPI_SKR     0x0044  /* Scrambling Key Register */
-@@ -100,7 +91,7 @@
- #define QSPI_SCR_DLYBS_MASK             GENMASK(23, 16)
- #define QSPI_SCR_DLYBS(n)               (((n) << 16) & QSPI_SCR_DLYBS_MASK)
- 
--/* Bitfields in QSPI_ICR (Instruction Code Register) */
-+/* Bitfields in QSPI_ICR (Read/Write Instruction Code Register) */
- #define QSPI_ICR_INST_MASK              GENMASK(7, 0)
- #define QSPI_ICR_INST(inst)             (((inst) << 0) & QSPI_ICR_INST_MASK)
- #define QSPI_ICR_OPT_MASK               GENMASK(23, 16)
-@@ -125,14 +116,12 @@
- #define QSPI_IFR_OPTL_4BIT              (2 << 8)
- #define QSPI_IFR_OPTL_8BIT              (3 << 8)
- #define QSPI_IFR_ADDRL                  BIT(10)
--#define QSPI_IFR_TFRTYP_MASK            GENMASK(13, 12)
--#define QSPI_IFR_TFRTYP_TRSFR_READ      (0 << 12)
--#define QSPI_IFR_TFRTYP_TRSFR_READ_MEM  (1 << 12)
--#define QSPI_IFR_TFRTYP_TRSFR_WRITE     (2 << 12)
--#define QSPI_IFR_TFRTYP_TRSFR_WRITE_MEM (3 << 13)
-+#define QSPI_IFR_TFRTYP_MEM		BIT(12)
-+#define QSPI_IFR_SAMA5D2_WRITE_TRSFR	BIT(13)
- #define QSPI_IFR_CRM                    BIT(14)
- #define QSPI_IFR_NBDUM_MASK             GENMASK(20, 16)
- #define QSPI_IFR_NBDUM(n)               (((n) << 16) & QSPI_IFR_NBDUM_MASK)
-+#define QSPI_IFR_APBTFRTYP_READ		BIT(24)	/* Defined in SAM9X60 */
- 
- /* Bitfields in QSPI_SMR (Scrambling Mode Register) */
- #define QSPI_SMR_SCREN                  BIT(0)
-@@ -148,24 +137,31 @@
- #define QSPI_WPSR_WPVSRC_MASK           GENMASK(15, 8)
- #define QSPI_WPSR_WPVSRC(src)           (((src) << 8) & QSPI_WPSR_WPVSRC)
- 
-+struct atmel_qspi_caps {
-+	bool has_qspick;
-+	bool has_ricr;
-+};
- 
- struct atmel_qspi {
- 	void __iomem		*regs;
- 	void __iomem		*mem;
--	struct clk		*clk;
-+	struct clk		*pclk;
-+	struct clk		*qspick;
- 	struct platform_device	*pdev;
-+	const struct atmel_qspi_caps *caps;
- 	u32			pending;
-+	u32			mr;
- 	struct completion	cmd_completion;
- };
- 
--struct qspi_mode {
-+struct atmel_qspi_mode {
- 	u8 cmd_buswidth;
- 	u8 addr_buswidth;
- 	u8 data_buswidth;
- 	u32 config;
- };
- 
--static const struct qspi_mode sama5d2_qspi_modes[] = {
-+static const struct atmel_qspi_mode atmel_qspi_modes[] = {
- 	{ 1, 1, 1, QSPI_IFR_WIDTH_SINGLE_BIT_SPI },
- 	{ 1, 1, 2, QSPI_IFR_WIDTH_DUAL_OUTPUT },
- 	{ 1, 1, 4, QSPI_IFR_WIDTH_QUAD_OUTPUT },
-@@ -175,19 +171,8 @@ static const struct qspi_mode sama5d2_qspi_modes[] = {
- 	{ 4, 4, 4, QSPI_IFR_WIDTH_QUAD_CMD },
- };
- 
--/* Register access functions */
--static inline u32 qspi_readl(struct atmel_qspi *aq, u32 reg)
--{
--	return readl_relaxed(aq->regs + reg);
--}
--
--static inline void qspi_writel(struct atmel_qspi *aq, u32 reg, u32 value)
--{
--	writel_relaxed(value, aq->regs + reg);
--}
--
--static inline bool is_compatible(const struct spi_mem_op *op,
--				 const struct qspi_mode *mode)
-+static inline bool atmel_qspi_is_compatible(const struct spi_mem_op *op,
-+					    const struct atmel_qspi_mode *mode)
- {
- 	if (op->cmd.buswidth != mode->cmd_buswidth)
- 		return false;
-@@ -201,21 +186,21 @@ static inline bool is_compatible(const struct spi_mem_op *op,
- 	return true;
- }
- 
--static int find_mode(const struct spi_mem_op *op)
-+static int atmel_qspi_find_mode(const struct spi_mem_op *op)
- {
- 	u32 i;
- 
--	for (i = 0; i < ARRAY_SIZE(sama5d2_qspi_modes); i++)
--		if (is_compatible(op, &sama5d2_qspi_modes[i]))
-+	for (i = 0; i < ARRAY_SIZE(atmel_qspi_modes); i++)
-+		if (atmel_qspi_is_compatible(op, &atmel_qspi_modes[i]))
- 			return i;
- 
--	return -1;
-+	return -ENOTSUPP;
- }
- 
- static bool atmel_qspi_supports_op(struct spi_mem *mem,
- 				   const struct spi_mem_op *op)
- {
--	if (find_mode(op) < 0)
-+	if (atmel_qspi_find_mode(op) < 0)
- 		return false;
- 
- 	/* special case not supported by hardware */
-@@ -226,29 +211,37 @@ static bool atmel_qspi_supports_op(struct spi_mem *mem,
- 	return true;
- }
- 
--static int atmel_qspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
-+static int atmel_qspi_set_cfg(struct atmel_qspi *aq,
-+			      const struct spi_mem_op *op, u32 *offset)
- {
--	struct atmel_qspi *aq = spi_controller_get_devdata(mem->spi->master);
--	int mode;
-+	u32 iar, icr, ifr;
- 	u32 dummy_cycles = 0;
--	u32 iar, icr, ifr, sr;
--	int err = 0;
-+	int mode;
- 
- 	iar = 0;
- 	icr = QSPI_ICR_INST(op->cmd.opcode);
- 	ifr = QSPI_IFR_INSTEN;
- 
--	qspi_writel(aq, QSPI_MR, QSPI_MR_SMM);
--
--	mode = find_mode(op);
-+	mode = atmel_qspi_find_mode(op);
- 	if (mode < 0)
--		return -ENOTSUPP;
--
--	ifr |= sama5d2_qspi_modes[mode].config;
-+		return mode;
-+	ifr |= atmel_qspi_modes[mode].config;
- 
- 	if (op->dummy.buswidth && op->dummy.nbytes)
- 		dummy_cycles = op->dummy.nbytes * 8 / op->dummy.buswidth;
- 
-+	/*
-+	 * The controller allows 24 and 32-bit addressing while NAND-flash
-+	 * requires 16-bit long. Handling 8-bit long addresses is done using
-+	 * the option field. For the 16-bit addresses, the workaround depends
-+	 * of the number of requested dummy bits. If there are 8 or more dummy
-+	 * cycles, the address is shifted and sent with the first dummy byte.
-+	 * Otherwise opcode is disabled and the first byte of the address
-+	 * contains the command opcode (works only if the opcode and address
-+	 * use the same buswidth). The limitation is when the 16-bit address is
-+	 * used without enough dummy cycles and the opcode is using a different
-+	 * buswidth than the address.
-+	 */
- 	if (op->addr.buswidth) {
- 		switch (op->addr.nbytes) {
- 		case 0:
-@@ -282,6 +275,9 @@ static int atmel_qspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
- 		}
- 	}
- 
-+	/* offset of the data access in the QSPI memory space */
-+	*offset = iar;
-+
- 	/* Set number of dummy cycles */
- 	if (dummy_cycles)
- 		ifr |= QSPI_IFR_NBDUM(dummy_cycles);
-@@ -290,49 +286,82 @@ static int atmel_qspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
- 	if (op->data.nbytes)
- 		ifr |= QSPI_IFR_DATAEN;
- 
--	if (op->data.dir == SPI_MEM_DATA_IN && op->data.nbytes)
--		ifr |= QSPI_IFR_TFRTYP_TRSFR_READ;
--	else
--		ifr |= QSPI_IFR_TFRTYP_TRSFR_WRITE;
-+	/*
-+	 * If the QSPI controller is set in regular SPI mode, set it in
-+	 * Serial Memory Mode (SMM).
-+	 */
-+	if (aq->mr != QSPI_MR_SMM) {
-+		writel_relaxed(QSPI_MR_SMM, aq->regs + QSPI_MR);
-+		aq->mr = QSPI_MR_SMM;
-+	}
- 
- 	/* Clear pending interrupts */
--	(void)qspi_readl(aq, QSPI_SR);
-+	(void)readl_relaxed(aq->regs + QSPI_SR);
-+
-+	if (aq->caps->has_ricr) {
-+		if (!op->addr.nbytes && op->data.dir == SPI_MEM_DATA_IN)
-+			ifr |= QSPI_IFR_APBTFRTYP_READ;
- 
--	/* Set QSPI Instruction Frame registers */
--	qspi_writel(aq, QSPI_IAR, iar);
--	qspi_writel(aq, QSPI_ICR, icr);
--	qspi_writel(aq, QSPI_IFR, ifr);
-+		/* Set QSPI Instruction Frame registers */
-+		writel_relaxed(iar, aq->regs + QSPI_IAR);
-+		if (op->data.dir == SPI_MEM_DATA_IN)
-+			writel_relaxed(icr, aq->regs + QSPI_RICR);
-+		else
-+			writel_relaxed(icr, aq->regs + QSPI_WICR);
-+		writel_relaxed(ifr, aq->regs + QSPI_IFR);
-+	} else {
-+		if (op->data.dir == SPI_MEM_DATA_OUT)
-+			ifr |= QSPI_IFR_SAMA5D2_WRITE_TRSFR;
-+
-+		/* Set QSPI Instruction Frame registers */
-+		writel_relaxed(iar, aq->regs + QSPI_IAR);
-+		writel_relaxed(icr, aq->regs + QSPI_ICR);
-+		writel_relaxed(ifr, aq->regs + QSPI_IFR);
-+	}
-+
-+	return 0;
-+}
-+
-+static int atmel_qspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
-+{
-+	struct atmel_qspi *aq = spi_controller_get_devdata(mem->spi->master);
-+	u32 sr, offset;
-+	int err;
-+
-+	err = atmel_qspi_set_cfg(aq, op, &offset);
-+	if (err)
-+		return err;
- 
- 	/* Skip to the final steps if there is no data */
- 	if (op->data.nbytes) {
- 		/* Dummy read of QSPI_IFR to synchronize APB and AHB accesses */
--		(void)qspi_readl(aq, QSPI_IFR);
-+		(void)readl_relaxed(aq->regs + QSPI_IFR);
- 
- 		/* Send/Receive data */
- 		if (op->data.dir == SPI_MEM_DATA_IN)
--			_memcpy_fromio(op->data.buf.in,
--				aq->mem + iar, op->data.nbytes);
-+			_memcpy_fromio(op->data.buf.in, aq->mem + offset,
-+				       op->data.nbytes);
- 		else
--			_memcpy_toio(aq->mem + iar,
--				op->data.buf.out, op->data.nbytes);
-+			_memcpy_toio(aq->mem + offset, op->data.buf.out,
-+				     op->data.nbytes);
- 
- 		/* Release the chip-select */
--		qspi_writel(aq, QSPI_CR, QSPI_CR_LASTXFER);
-+		writel_relaxed(QSPI_CR_LASTXFER, aq->regs + QSPI_CR);
- 	}
- 
- 	/* Poll INSTRuction End status */
--	sr = qspi_readl(aq, QSPI_SR);
-+	sr = readl_relaxed(aq->regs + QSPI_SR);
- 	if ((sr & QSPI_SR_CMD_COMPLETED) == QSPI_SR_CMD_COMPLETED)
- 		return err;
- 
- 	/* Wait for INSTRuction End interrupt */
- 	reinit_completion(&aq->cmd_completion);
- 	aq->pending = sr & QSPI_SR_CMD_COMPLETED;
--	qspi_writel(aq, QSPI_IER, QSPI_SR_CMD_COMPLETED);
-+	writel_relaxed(QSPI_SR_CMD_COMPLETED, aq->regs + QSPI_IER);
- 	if (!wait_for_completion_timeout(&aq->cmd_completion,
- 					 msecs_to_jiffies(1000)))
- 		err = -ETIMEDOUT;
--	qspi_writel(aq, QSPI_IDR, QSPI_SR_CMD_COMPLETED);
-+	writel_relaxed(QSPI_SR_CMD_COMPLETED, aq->regs + QSPI_IDR);
- 
- 	return err;
- }
-@@ -361,7 +390,7 @@ static int atmel_qspi_setup(struct spi_device *spi)
- 	if (!spi->max_speed_hz)
- 		return -EINVAL;
- 
--	src_rate = clk_get_rate(aq->clk);
-+	src_rate = clk_get_rate(aq->pclk);
- 	if (!src_rate)
- 		return -EINVAL;
- 
-@@ -371,7 +400,7 @@ static int atmel_qspi_setup(struct spi_device *spi)
- 		scbr--;
- 
- 	scr = QSPI_SCR_SCBR(scbr);
--	qspi_writel(aq, QSPI_SCR, scr);
-+	writel_relaxed(scr, aq->regs + QSPI_SCR);
- 
- 	return 0;
- }
-@@ -379,21 +408,25 @@ static int atmel_qspi_setup(struct spi_device *spi)
- static int atmel_qspi_init(struct atmel_qspi *aq)
- {
- 	/* Reset the QSPI controller */
--	qspi_writel(aq, QSPI_CR, QSPI_CR_SWRST);
-+	writel_relaxed(QSPI_CR_SWRST, aq->regs + QSPI_CR);
-+
-+	/* Set the QSPI controller by default in Serial Memory Mode */
-+	writel_relaxed(QSPI_MR_SMM, aq->regs + QSPI_MR);
-+	aq->mr = QSPI_MR_SMM;
- 
- 	/* Enable the QSPI controller */
--	qspi_writel(aq, QSPI_CR, QSPI_CR_QSPIEN);
-+	writel_relaxed(QSPI_CR_QSPIEN, aq->regs + QSPI_CR);
- 
- 	return 0;
- }
- 
- static irqreturn_t atmel_qspi_interrupt(int irq, void *dev_id)
- {
--	struct atmel_qspi *aq = (struct atmel_qspi *)dev_id;
-+	struct atmel_qspi *aq = dev_id;
- 	u32 status, mask, pending;
- 
--	status = qspi_readl(aq, QSPI_SR);
--	mask = qspi_readl(aq, QSPI_IMR);
-+	status = readl_relaxed(aq->regs + QSPI_SR);
-+	mask = readl_relaxed(aq->regs + QSPI_IMR);
- 	pending = status & mask;
- 
- 	if (!pending)
-@@ -449,44 +482,74 @@ static int atmel_qspi_probe(struct platform_device *pdev)
- 	}
- 
- 	/* Get the peripheral clock */
--	aq->clk = devm_clk_get(&pdev->dev, NULL);
--	if (IS_ERR(aq->clk)) {
-+	aq->pclk = devm_clk_get(&pdev->dev, "pclk");
-+	if (IS_ERR(aq->pclk))
-+		aq->pclk = devm_clk_get(&pdev->dev, NULL);
-+
-+	if (IS_ERR(aq->pclk)) {
- 		dev_err(&pdev->dev, "missing peripheral clock\n");
--		err = PTR_ERR(aq->clk);
-+		err = PTR_ERR(aq->pclk);
- 		goto exit;
- 	}
- 
- 	/* Enable the peripheral clock */
--	err = clk_prepare_enable(aq->clk);
-+	err = clk_prepare_enable(aq->pclk);
- 	if (err) {
- 		dev_err(&pdev->dev, "failed to enable the peripheral clock\n");
- 		goto exit;
- 	}
- 
-+	aq->caps = of_device_get_match_data(&pdev->dev);
-+	if (!aq->caps) {
-+		dev_err(&pdev->dev, "Could not retrieve QSPI caps\n");
-+		err = -EINVAL;
-+		goto exit;
-+	}
-+
-+	if (aq->caps->has_qspick) {
-+		/* Get the QSPI system clock */
-+		aq->qspick = devm_clk_get(&pdev->dev, "qspick");
-+		if (IS_ERR(aq->qspick)) {
-+			dev_err(&pdev->dev, "missing system clock\n");
-+			err = PTR_ERR(aq->qspick);
-+			goto disable_pclk;
-+		}
-+
-+		/* Enable the QSPI system clock */
-+		err = clk_prepare_enable(aq->qspick);
-+		if (err) {
-+			dev_err(&pdev->dev,
-+				"failed to enable the QSPI system clock\n");
-+			goto disable_pclk;
-+		}
-+	}
-+
- 	/* Request the IRQ */
- 	irq = platform_get_irq(pdev, 0);
- 	if (irq < 0) {
- 		dev_err(&pdev->dev, "missing IRQ\n");
- 		err = irq;
--		goto disable_clk;
-+		goto disable_qspick;
- 	}
- 	err = devm_request_irq(&pdev->dev, irq, atmel_qspi_interrupt,
- 			       0, dev_name(&pdev->dev), aq);
- 	if (err)
--		goto disable_clk;
-+		goto disable_qspick;
- 
- 	err = atmel_qspi_init(aq);
- 	if (err)
--		goto disable_clk;
-+		goto disable_qspick;
- 
- 	err = spi_register_controller(ctrl);
- 	if (err)
--		goto disable_clk;
-+		goto disable_qspick;
- 
- 	return 0;
- 
--disable_clk:
--	clk_disable_unprepare(aq->clk);
-+disable_qspick:
-+	clk_disable_unprepare(aq->qspick);
-+disable_pclk:
-+	clk_disable_unprepare(aq->pclk);
- exit:
- 	spi_controller_put(ctrl);
- 
-@@ -499,8 +562,9 @@ static int atmel_qspi_remove(struct platform_device *pdev)
- 	struct atmel_qspi *aq = spi_controller_get_devdata(ctrl);
- 
- 	spi_unregister_controller(ctrl);
--	qspi_writel(aq, QSPI_CR, QSPI_CR_QSPIDIS);
--	clk_disable_unprepare(aq->clk);
-+	writel_relaxed(QSPI_CR_QSPIDIS, aq->regs + QSPI_CR);
-+	clk_disable_unprepare(aq->qspick);
-+	clk_disable_unprepare(aq->pclk);
- 	return 0;
- }
- 
-@@ -508,7 +572,8 @@ static int __maybe_unused atmel_qspi_suspend(struct device *dev)
- {
- 	struct atmel_qspi *aq = dev_get_drvdata(dev);
- 
--	clk_disable_unprepare(aq->clk);
-+	clk_disable_unprepare(aq->qspick);
-+	clk_disable_unprepare(aq->pclk);
- 
- 	return 0;
- }
-@@ -517,7 +582,8 @@ static int __maybe_unused atmel_qspi_resume(struct device *dev)
- {
- 	struct atmel_qspi *aq = dev_get_drvdata(dev);
- 
--	clk_prepare_enable(aq->clk);
-+	clk_prepare_enable(aq->pclk);
-+	clk_prepare_enable(aq->qspick);
- 
- 	return atmel_qspi_init(aq);
- }
-@@ -525,8 +591,22 @@ static int __maybe_unused atmel_qspi_resume(struct device *dev)
- static SIMPLE_DEV_PM_OPS(atmel_qspi_pm_ops, atmel_qspi_suspend,
- 			 atmel_qspi_resume);
- 
-+static const struct atmel_qspi_caps atmel_sama5d2_qspi_caps = {};
-+
-+static const struct atmel_qspi_caps atmel_sam9x60_qspi_caps = {
-+	.has_qspick = true,
-+	.has_ricr = true,
-+};
-+
- static const struct of_device_id atmel_qspi_dt_ids[] = {
--	{ .compatible = "atmel,sama5d2-qspi" },
-+	{
-+		.compatible = "atmel,sama5d2-qspi",
-+		.data = &atmel_sama5d2_qspi_caps,
-+	},
-+	{
-+		.compatible = "microchip,sam9x60-qspi",
-+		.data = &atmel_sam9x60_qspi_caps,
-+	},
- 	{ /* sentinel */ }
- };
- 
-diff --git a/drivers/spi/spi-ath79.c b/drivers/spi/spi-ath79.c
-index 3f6b657394de..847f354ebef1 100644
---- a/drivers/spi/spi-ath79.c
-+++ b/drivers/spi/spi-ath79.c
-@@ -21,18 +21,26 @@
- #include <linux/spi/spi.h>
- #include <linux/spi/spi_bitbang.h>
- #include <linux/bitops.h>
--#include <linux/gpio.h>
- #include <linux/clk.h>
- #include <linux/err.h>
--
--#include <asm/mach-ath79/ar71xx_regs.h>
--#include <asm/mach-ath79/ath79_spi_platform.h>
-+#include <linux/platform_data/spi-ath79.h>
- 
- #define DRV_NAME	"ath79-spi"
- 
- #define ATH79_SPI_RRW_DELAY_FACTOR	12000
- #define MHZ				(1000 * 1000)
- 
-+#define AR71XX_SPI_REG_FS		0x00	/* Function Select */
-+#define AR71XX_SPI_REG_CTRL		0x04	/* SPI Control */
-+#define AR71XX_SPI_REG_IOC		0x08	/* SPI I/O Control */
-+#define AR71XX_SPI_REG_RDS		0x0c	/* Read Data Shift */
-+
-+#define AR71XX_SPI_FS_GPIO		BIT(0)	/* Enable GPIO mode */
-+
-+#define AR71XX_SPI_IOC_DO		BIT(0)	/* Data Out pin */
-+#define AR71XX_SPI_IOC_CLK		BIT(8)	/* CLK pin */
-+#define AR71XX_SPI_IOC_CS(n)		BIT(16 + (n))
-+
- struct ath79_spi {
- 	struct spi_bitbang	bitbang;
- 	u32			ioc_base;
-@@ -67,31 +75,14 @@ static void ath79_spi_chipselect(struct spi_device *spi, int is_active)
- {
- 	struct ath79_spi *sp = ath79_spidev_to_sp(spi);
- 	int cs_high = (spi->mode & SPI_CS_HIGH) ? is_active : !is_active;
-+	u32 cs_bit = AR71XX_SPI_IOC_CS(spi->chip_select);
- 
--	if (is_active) {
--		/* set initial clock polarity */
--		if (spi->mode & SPI_CPOL)
--			sp->ioc_base |= AR71XX_SPI_IOC_CLK;
--		else
--			sp->ioc_base &= ~AR71XX_SPI_IOC_CLK;
--
--		ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base);
--	}
--
--	if (gpio_is_valid(spi->cs_gpio)) {
--		/* SPI is normally active-low */
--		gpio_set_value_cansleep(spi->cs_gpio, cs_high);
--	} else {
--		u32 cs_bit = AR71XX_SPI_IOC_CS(spi->chip_select);
--
--		if (cs_high)
--			sp->ioc_base |= cs_bit;
--		else
--			sp->ioc_base &= ~cs_bit;
--
--		ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base);
--	}
-+	if (cs_high)
-+		sp->ioc_base |= cs_bit;
-+	else
-+		sp->ioc_base &= ~cs_bit;
- 
-+	ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base);
- }
- 
- static void ath79_spi_enable(struct ath79_spi *sp)
-@@ -103,6 +94,9 @@ static void ath79_spi_enable(struct ath79_spi *sp)
- 	sp->reg_ctrl = ath79_spi_rr(sp, AR71XX_SPI_REG_CTRL);
- 	sp->ioc_base = ath79_spi_rr(sp, AR71XX_SPI_REG_IOC);
- 
-+	/* clear clk and mosi in the base state */
-+	sp->ioc_base &= ~(AR71XX_SPI_IOC_DO | AR71XX_SPI_IOC_CLK);
-+
- 	/* TODO: setup speed? */
- 	ath79_spi_wr(sp, AR71XX_SPI_REG_CTRL, 0x43);
- }
-@@ -115,66 +109,6 @@ static void ath79_spi_disable(struct ath79_spi *sp)
- 	ath79_spi_wr(sp, AR71XX_SPI_REG_FS, 0);
- }
- 
--static int ath79_spi_setup_cs(struct spi_device *spi)
--{
--	struct ath79_spi *sp = ath79_spidev_to_sp(spi);
--	int status;
--
--	status = 0;
--	if (gpio_is_valid(spi->cs_gpio)) {
--		unsigned long flags;
--
--		flags = GPIOF_DIR_OUT;
--		if (spi->mode & SPI_CS_HIGH)
--			flags |= GPIOF_INIT_LOW;
--		else
--			flags |= GPIOF_INIT_HIGH;
--
--		status = gpio_request_one(spi->cs_gpio, flags,
--					  dev_name(&spi->dev));
--	} else {
--		u32 cs_bit = AR71XX_SPI_IOC_CS(spi->chip_select);
--
--		if (spi->mode & SPI_CS_HIGH)
--			sp->ioc_base &= ~cs_bit;
--		else
--			sp->ioc_base |= cs_bit;
--
--		ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base);
--	}
--
--	return status;
--}
--
--static void ath79_spi_cleanup_cs(struct spi_device *spi)
--{
--	if (gpio_is_valid(spi->cs_gpio))
--		gpio_free(spi->cs_gpio);
--}
--
--static int ath79_spi_setup(struct spi_device *spi)
--{
--	int status = 0;
--
--	if (!spi->controller_state) {
--		status = ath79_spi_setup_cs(spi);
--		if (status)
--			return status;
--	}
--
--	status = spi_bitbang_setup(spi);
--	if (status && !spi->controller_state)
--		ath79_spi_cleanup_cs(spi);
--
--	return status;
--}
--
--static void ath79_spi_cleanup(struct spi_device *spi)
--{
--	ath79_spi_cleanup_cs(spi);
--	spi_bitbang_cleanup(spi);
--}
--
- static u32 ath79_spi_txrx_mode0(struct spi_device *spi, unsigned int nsecs,
- 			       u32 word, u8 bits, unsigned flags)
- {
-@@ -225,9 +159,10 @@ static int ath79_spi_probe(struct platform_device *pdev)
- 
- 	pdata = dev_get_platdata(&pdev->dev);
- 
-+	master->use_gpio_descriptors = true;
- 	master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32);
--	master->setup = ath79_spi_setup;
--	master->cleanup = ath79_spi_cleanup;
-+	master->setup = spi_bitbang_setup;
-+	master->cleanup = spi_bitbang_cleanup;
- 	if (pdata) {
- 		master->bus_num = pdata->bus_num;
- 		master->num_chipselect = pdata->num_chipselect;
-@@ -236,7 +171,6 @@ static int ath79_spi_probe(struct platform_device *pdev)
- 	sp->bitbang.master = master;
- 	sp->bitbang.chipselect = ath79_spi_chipselect;
- 	sp->bitbang.txrx_word[SPI_MODE_0] = ath79_spi_txrx_mode0;
--	sp->bitbang.setup_transfer = spi_bitbang_setup_transfer;
- 	sp->bitbang.flags = SPI_CS_HIGH;
- 
- 	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c
-index 74fddcd3282b..4954f0ab1606 100644
---- a/drivers/spi/spi-atmel.c
-+++ b/drivers/spi/spi-atmel.c
-@@ -23,8 +23,7 @@
- #include <linux/of.h>
- 
- #include <linux/io.h>
--#include <linux/gpio.h>
--#include <linux/of_gpio.h>
-+#include <linux/gpio/consumer.h>
- #include <linux/pinctrl/consumer.h>
- #include <linux/pm_runtime.h>
- 
-@@ -312,7 +311,7 @@ struct atmel_spi {
- 
- /* Controller-specific per-slave state */
- struct atmel_spi_device {
--	unsigned int		npcs_pin;
-+	struct gpio_desc	*npcs_pin;
- 	u32			csr;
- };
- 
-@@ -355,7 +354,6 @@ static bool atmel_spi_is_v2(struct atmel_spi *as)
- static void cs_activate(struct atmel_spi *as, struct spi_device *spi)
- {
- 	struct atmel_spi_device *asd = spi->controller_state;
--	unsigned active = spi->mode & SPI_CS_HIGH;
- 	u32 mr;
- 
- 	if (atmel_spi_is_v2(as)) {
-@@ -379,7 +377,7 @@ static void cs_activate(struct atmel_spi *as, struct spi_device *spi)
- 
- 		mr = spi_readl(as, MR);
- 		if (as->use_cs_gpios)
--			gpio_set_value(asd->npcs_pin, active);
-+			gpiod_set_value(asd->npcs_pin, 1);
- 	} else {
- 		u32 cpol = (spi->mode & SPI_CPOL) ? SPI_BIT(CPOL) : 0;
- 		int i;
-@@ -396,19 +394,16 @@ static void cs_activate(struct atmel_spi *as, struct spi_device *spi)
- 		mr = spi_readl(as, MR);
- 		mr = SPI_BFINS(PCS, ~(1 << spi->chip_select), mr);
- 		if (as->use_cs_gpios && spi->chip_select != 0)
--			gpio_set_value(asd->npcs_pin, active);
-+			gpiod_set_value(asd->npcs_pin, 1);
- 		spi_writel(as, MR, mr);
- 	}
- 
--	dev_dbg(&spi->dev, "activate %u%s, mr %08x\n",
--			asd->npcs_pin, active ? " (high)" : "",
--			mr);
-+	dev_dbg(&spi->dev, "activate NPCS, mr %08x\n", mr);
- }
- 
- static void cs_deactivate(struct atmel_spi *as, struct spi_device *spi)
- {
- 	struct atmel_spi_device *asd = spi->controller_state;
--	unsigned active = spi->mode & SPI_CS_HIGH;
- 	u32 mr;
- 
- 	/* only deactivate *this* device; sometimes transfers to
-@@ -420,14 +415,12 @@ static void cs_deactivate(struct atmel_spi *as, struct spi_device *spi)
- 		spi_writel(as, MR, mr);
- 	}
- 
--	dev_dbg(&spi->dev, "DEactivate %u%s, mr %08x\n",
--			asd->npcs_pin, active ? " (low)" : "",
--			mr);
-+	dev_dbg(&spi->dev, "DEactivate NPCS, mr %08x\n", mr);
- 
- 	if (!as->use_cs_gpios)
- 		spi_writel(as, CR, SPI_BIT(LASTXFER));
- 	else if (atmel_spi_is_v2(as) || spi->chip_select != 0)
--		gpio_set_value(asd->npcs_pin, !active);
-+		gpiod_set_value(asd->npcs_pin, 0);
- }
- 
- static void atmel_spi_lock(struct atmel_spi *as) __acquires(&as->lock)
-@@ -1188,7 +1181,6 @@ static int atmel_spi_setup(struct spi_device *spi)
- 	struct atmel_spi_device	*asd;
- 	u32			csr;
- 	unsigned int		bits = spi->bits_per_word;
--	unsigned int		npcs_pin;
- 
- 	as = spi_master_get_devdata(spi->master);
- 
-@@ -1209,21 +1201,14 @@ static int atmel_spi_setup(struct spi_device *spi)
- 		csr |= SPI_BIT(CSAAT);
- 
- 	/* DLYBS is mostly irrelevant since we manage chipselect using GPIOs.
--	 *
--	 * DLYBCT would add delays between words, slowing down transfers.
--	 * It could potentially be useful to cope with DMA bottlenecks, but
--	 * in those cases it's probably best to just use a lower bitrate.
- 	 */
- 	csr |= SPI_BF(DLYBS, 0);
--	csr |= SPI_BF(DLYBCT, 0);
--
--	/* chipselect must have been muxed as GPIO (e.g. in board setup) */
--	npcs_pin = (unsigned long)spi->controller_data;
- 
--	if (!as->use_cs_gpios)
--		npcs_pin = spi->chip_select;
--	else if (gpio_is_valid(spi->cs_gpio))
--		npcs_pin = spi->cs_gpio;
-+	/* DLYBCT adds delays between words.  This is useful for slow devices
-+	 * that need a bit of time to setup the next transfer.
-+	 */
-+	csr |= SPI_BF(DLYBCT,
-+			(as->spi_clk / 1000000 * spi->word_delay_usecs) >> 5);
- 
- 	asd = spi->controller_state;
- 	if (!asd) {
-@@ -1231,11 +1216,21 @@ static int atmel_spi_setup(struct spi_device *spi)
- 		if (!asd)
- 			return -ENOMEM;
- 
--		if (as->use_cs_gpios)
--			gpio_direction_output(npcs_pin,
--					      !(spi->mode & SPI_CS_HIGH));
-+		/*
-+		 * If use_cs_gpios is true this means that we have "cs-gpios"
-+		 * defined in the device tree node so we should have
-+		 * gotten the GPIO lines from the device tree inside the
-+		 * SPI core. Warn if this is not the case but continue since
-+		 * CS GPIOs are after all optional.
-+		 */
-+		if (as->use_cs_gpios) {
-+			if (!spi->cs_gpiod) {
-+				dev_err(&spi->dev,
-+					"host claims to use CS GPIOs but no CS found in DT by the SPI core\n");
-+			}
-+			asd->npcs_pin = spi->cs_gpiod;
-+		}
- 
--		asd->npcs_pin = npcs_pin;
- 		spi->controller_state = asd;
- 	}
- 
-@@ -1473,41 +1468,6 @@ static void atmel_get_caps(struct atmel_spi *as)
- 	as->caps.has_pdc_support = version < 0x212;
- }
- 
--/*-------------------------------------------------------------------------*/
--static int atmel_spi_gpio_cs(struct platform_device *pdev)
--{
--	struct spi_master	*master = platform_get_drvdata(pdev);
--	struct atmel_spi	*as = spi_master_get_devdata(master);
--	struct device_node	*np = master->dev.of_node;
--	int			i;
--	int			ret = 0;
--	int			nb = 0;
--
--	if (!as->use_cs_gpios)
--		return 0;
--
--	if (!np)
--		return 0;
--
--	nb = of_gpio_named_count(np, "cs-gpios");
--	for (i = 0; i < nb; i++) {
--		int cs_gpio = of_get_named_gpio(pdev->dev.of_node,
--						"cs-gpios", i);
--
--		if (cs_gpio == -EPROBE_DEFER)
--			return cs_gpio;
--
--		if (gpio_is_valid(cs_gpio)) {
--			ret = devm_gpio_request(&pdev->dev, cs_gpio,
--						dev_name(&pdev->dev));
--			if (ret)
--				return ret;
--		}
--	}
--
--	return 0;
--}
--
- static void atmel_spi_init(struct atmel_spi *as)
- {
- 	spi_writel(as, CR, SPI_BIT(SWRST));
-@@ -1560,6 +1520,7 @@ static int atmel_spi_probe(struct platform_device *pdev)
- 		goto out_free;
- 
- 	/* the spi->mode bits understood by this driver: */
-+	master->use_gpio_descriptors = true;
- 	master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
- 	master->bits_per_word_mask = SPI_BPW_RANGE_MASK(8, 16);
- 	master->dev.of_node = pdev->dev.of_node;
-@@ -1592,6 +1553,11 @@ static int atmel_spi_probe(struct platform_device *pdev)
- 
- 	atmel_get_caps(as);
- 
-+	/*
-+	 * If there are chip selects in the device tree, those will be
-+	 * discovered by the SPI core when registering the SPI master
-+	 * and assigned to each SPI device.
-+	 */
- 	as->use_cs_gpios = true;
- 	if (atmel_spi_is_v2(as) &&
- 	    pdev->dev.of_node &&
-@@ -1600,10 +1566,6 @@ static int atmel_spi_probe(struct platform_device *pdev)
- 		master->num_chipselect = 4;
- 	}
- 
--	ret = atmel_spi_gpio_cs(pdev);
--	if (ret)
--		goto out_unmap_regs;
--
- 	as->use_dma = false;
- 	as->use_pdc = false;
- 	if (as->caps.has_dma_support) {
-diff --git a/drivers/spi/spi-bcm2835aux.c b/drivers/spi/spi-bcm2835aux.c
-index 671e374e1b01..f7e054848ca5 100644
---- a/drivers/spi/spi-bcm2835aux.c
-+++ b/drivers/spi/spi-bcm2835aux.c
-@@ -456,7 +456,7 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
- 	}
- 
- 	bs->clk = devm_clk_get(&pdev->dev, NULL);
--	if ((!bs->clk) || (IS_ERR(bs->clk))) {
-+	if (IS_ERR(bs->clk)) {
- 		err = PTR_ERR(bs->clk);
- 		dev_err(&pdev->dev, "could not get clk: %d\n", err);
- 		goto out_master_put;
-diff --git a/drivers/spi/spi-bitbang.c b/drivers/spi/spi-bitbang.c
-index f29176000b8d..dd9a8c54a693 100644
---- a/drivers/spi/spi-bitbang.c
-+++ b/drivers/spi/spi-bitbang.c
-@@ -213,19 +213,6 @@ int spi_bitbang_setup(struct spi_device *spi)
- 
- 	dev_dbg(&spi->dev, "%s, %u nsec/bit\n", __func__, 2 * cs->nsecs);
- 
--	/* NOTE we _need_ to call chipselect() early, ideally with adapter
--	 * setup, unless the hardware defaults cooperate to avoid confusion
--	 * between normal (active low) and inverted chipselects.
--	 */
--
--	/* deselect chip (low or high) */
--	mutex_lock(&bitbang->lock);
--	if (!bitbang->busy) {
--		bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
--		ndelay(cs->nsecs);
--	}
--	mutex_unlock(&bitbang->lock);
--
- 	return 0;
- }
- EXPORT_SYMBOL_GPL(spi_bitbang_setup);
-diff --git a/drivers/spi/spi-cadence.c b/drivers/spi/spi-cadence.c
-index 7c88f74f7f47..43d0e79842ac 100644
---- a/drivers/spi/spi-cadence.c
-+++ b/drivers/spi/spi-cadence.c
-@@ -13,7 +13,7 @@
- 
- #include <linux/clk.h>
- #include <linux/delay.h>
--#include <linux/gpio.h>
-+#include <linux/gpio/consumer.h>
- #include <linux/interrupt.h>
- #include <linux/io.h>
- #include <linux/module.h>
-@@ -128,10 +128,6 @@ struct cdns_spi {
- 	u32 is_decoded_cs;
- };
- 
--struct cdns_spi_device_data {
--	bool gpio_requested;
--};
--
- /* Macros for the SPI controller read/write */
- static inline u32 cdns_spi_read(struct cdns_spi *xspi, u32 offset)
- {
-@@ -176,16 +172,16 @@ static void cdns_spi_init_hw(struct cdns_spi *xspi)
- /**
-  * cdns_spi_chipselect - Select or deselect the chip select line
-  * @spi:	Pointer to the spi_device structure
-- * @is_high:	Select(0) or deselect (1) the chip select line
-+ * @enable:	Select (1) or deselect (0) the chip select line
-  */
--static void cdns_spi_chipselect(struct spi_device *spi, bool is_high)
-+static void cdns_spi_chipselect(struct spi_device *spi, bool enable)
- {
- 	struct cdns_spi *xspi = spi_master_get_devdata(spi->master);
- 	u32 ctrl_reg;
- 
- 	ctrl_reg = cdns_spi_read(xspi, CDNS_SPI_CR);
- 
--	if (is_high) {
-+	if (!enable) {
- 		/* Deselect the slave */
- 		ctrl_reg |= CDNS_SPI_CR_SSCTRL;
- 	} else {
-@@ -469,64 +465,6 @@ static int cdns_unprepare_transfer_hardware(struct spi_master *master)
- 	return 0;
- }
- 
--static int cdns_spi_setup(struct spi_device *spi)
--{
--
--	int ret = -EINVAL;
--	struct cdns_spi_device_data *cdns_spi_data = spi_get_ctldata(spi);
--
--	/* this is a pin managed by the controller, leave it alone */
--	if (spi->cs_gpio == -ENOENT)
--		return 0;
--
--	/* this seems to be the first time we're here */
--	if (!cdns_spi_data) {
--		cdns_spi_data = kzalloc(sizeof(*cdns_spi_data), GFP_KERNEL);
--		if (!cdns_spi_data)
--			return -ENOMEM;
--		cdns_spi_data->gpio_requested = false;
--		spi_set_ctldata(spi, cdns_spi_data);
--	}
--
--	/* if we haven't done so, grab the gpio */
--	if (!cdns_spi_data->gpio_requested && gpio_is_valid(spi->cs_gpio)) {
--		ret = gpio_request_one(spi->cs_gpio,
--				       (spi->mode & SPI_CS_HIGH) ?
--				       GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH,
--				       dev_name(&spi->dev));
--		if (ret)
--			dev_err(&spi->dev, "can't request chipselect gpio %d\n",
--				spi->cs_gpio);
--		else
--			cdns_spi_data->gpio_requested = true;
--	} else {
--		if (gpio_is_valid(spi->cs_gpio)) {
--			int mode = ((spi->mode & SPI_CS_HIGH) ?
--				    GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH);
--
--			ret = gpio_direction_output(spi->cs_gpio, mode);
--			if (ret)
--				dev_err(&spi->dev, "chipselect gpio %d setup failed (%d)\n",
--					spi->cs_gpio, ret);
--		}
--	}
--
--	return ret;
--}
--
--static void cdns_spi_cleanup(struct spi_device *spi)
--{
--	struct cdns_spi_device_data *cdns_spi_data = spi_get_ctldata(spi);
--
--	if (cdns_spi_data) {
--		if (cdns_spi_data->gpio_requested)
--			gpio_free(spi->cs_gpio);
--		kfree(cdns_spi_data);
--		spi_set_ctldata(spi, NULL);
--	}
--
--}
--
- /**
-  * cdns_spi_probe - Probe method for the SPI driver
-  * @pdev:	Pointer to the platform_device structure
-@@ -584,11 +522,6 @@ static int cdns_spi_probe(struct platform_device *pdev)
- 		goto clk_dis_apb;
- 	}
- 
--	pm_runtime_use_autosuspend(&pdev->dev);
--	pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
--	pm_runtime_set_active(&pdev->dev);
--	pm_runtime_enable(&pdev->dev);
--
- 	ret = of_property_read_u32(pdev->dev.of_node, "num-cs", &num_cs);
- 	if (ret < 0)
- 		master->num_chipselect = CDNS_SPI_DEFAULT_NUM_CS;
-@@ -603,8 +536,10 @@ static int cdns_spi_probe(struct platform_device *pdev)
- 	/* SPI controller initializations */
- 	cdns_spi_init_hw(xspi);
- 
--	pm_runtime_mark_last_busy(&pdev->dev);
--	pm_runtime_put_autosuspend(&pdev->dev);
-+	pm_runtime_set_active(&pdev->dev);
-+	pm_runtime_enable(&pdev->dev);
-+	pm_runtime_use_autosuspend(&pdev->dev);
-+	pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
- 
- 	irq = platform_get_irq(pdev, 0);
- 	if (irq <= 0) {
-@@ -621,13 +556,12 @@ static int cdns_spi_probe(struct platform_device *pdev)
- 		goto clk_dis_all;
- 	}
- 
-+	master->use_gpio_descriptors = true;
- 	master->prepare_transfer_hardware = cdns_prepare_transfer_hardware;
- 	master->prepare_message = cdns_prepare_message;
- 	master->transfer_one = cdns_transfer_one;
- 	master->unprepare_transfer_hardware = cdns_unprepare_transfer_hardware;
- 	master->set_cs = cdns_spi_chipselect;
--	master->setup = cdns_spi_setup;
--	master->cleanup = cdns_spi_cleanup;
- 	master->auto_runtime_pm = true;
- 	master->mode_bits = SPI_CPOL | SPI_CPHA;
- 
-diff --git a/drivers/spi/spi-clps711x.c b/drivers/spi/spi-clps711x.c
-index 18193df2eba8..8c03c409fc07 100644
---- a/drivers/spi/spi-clps711x.c
-+++ b/drivers/spi/spi-clps711x.c
-@@ -11,7 +11,7 @@
- 
- #include <linux/io.h>
- #include <linux/clk.h>
--#include <linux/gpio.h>
-+#include <linux/gpio/consumer.h>
- #include <linux/module.h>
- #include <linux/interrupt.h>
- #include <linux/platform_device.h>
-@@ -36,25 +36,6 @@ struct spi_clps711x_data {
- 	int			len;
- };
- 
--static int spi_clps711x_setup(struct spi_device *spi)
--{
--	if (!spi->controller_state) {
--		int ret;
--
--		ret = devm_gpio_request(&spi->master->dev, spi->cs_gpio,
--					dev_name(&spi->master->dev));
--		if (ret)
--			return ret;
--
--		spi->controller_state = spi;
--	}
--
--	/* We are expect that SPI-device is not selected */
--	gpio_direction_output(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH));
--
--	return 0;
--}
--
- static int spi_clps711x_prepare_message(struct spi_master *master,
- 					struct spi_message *msg)
- {
-@@ -125,11 +106,11 @@ static int spi_clps711x_probe(struct platform_device *pdev)
- 	if (!master)
- 		return -ENOMEM;
- 
-+	master->use_gpio_descriptors = true;
- 	master->bus_num = -1;
- 	master->mode_bits = SPI_CPHA | SPI_CS_HIGH;
- 	master->bits_per_word_mask =  SPI_BPW_RANGE_MASK(1, 8);
- 	master->dev.of_node = pdev->dev.of_node;
--	master->setup = spi_clps711x_setup;
- 	master->prepare_message = spi_clps711x_prepare_message;
- 	master->transfer_one = spi_clps711x_transfer_one;
- 
-diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c
-index 56adec83f8fc..eb246ebcfa3a 100644
---- a/drivers/spi/spi-davinci.c
-+++ b/drivers/spi/spi-davinci.c
-@@ -15,7 +15,7 @@
- 
- #include <linux/interrupt.h>
- #include <linux/io.h>
--#include <linux/gpio.h>
-+#include <linux/gpio/consumer.h>
- #include <linux/module.h>
- #include <linux/delay.h>
- #include <linux/platform_device.h>
-@@ -25,7 +25,6 @@
- #include <linux/dma-mapping.h>
- #include <linux/of.h>
- #include <linux/of_device.h>
--#include <linux/of_gpio.h>
- #include <linux/spi/spi.h>
- #include <linux/spi/spi_bitbang.h>
- #include <linux/slab.h>
-@@ -222,12 +221,17 @@ static void davinci_spi_chipselect(struct spi_device *spi, int value)
- 	 * Board specific chip select logic decides the polarity and cs
- 	 * line for the controller
- 	 */
--	if (spi->cs_gpio >= 0) {
-+	if (spi->cs_gpiod) {
-+		/*
-+		 * FIXME: is this code ever executed? This host does not
-+		 * set SPI_MASTER_GPIO_SS so this chipselect callback should
-+		 * not get called from the SPI core when we are using
-+		 * GPIOs for chip select.
-+		 */
- 		if (value == BITBANG_CS_ACTIVE)
--			gpio_set_value(spi->cs_gpio, spi->mode & SPI_CS_HIGH);
-+			gpiod_set_value(spi->cs_gpiod, 1);
- 		else
--			gpio_set_value(spi->cs_gpio,
--				!(spi->mode & SPI_CS_HIGH));
-+			gpiod_set_value(spi->cs_gpiod, 0);
- 	} else {
- 		if (value == BITBANG_CS_ACTIVE) {
- 			if (!(spi->mode & SPI_CS_WORD))
-@@ -418,30 +422,18 @@ static int davinci_spi_of_setup(struct spi_device *spi)
-  */
- static int davinci_spi_setup(struct spi_device *spi)
- {
--	int retval = 0;
- 	struct davinci_spi *dspi;
--	struct spi_master *master = spi->master;
- 	struct device_node *np = spi->dev.of_node;
- 	bool internal_cs = true;
- 
- 	dspi = spi_master_get_devdata(spi->master);
- 
- 	if (!(spi->mode & SPI_NO_CS)) {
--		if (np && (master->cs_gpios != NULL) && (spi->cs_gpio >= 0)) {
--			retval = gpio_direction_output(
--				      spi->cs_gpio, !(spi->mode & SPI_CS_HIGH));
-+		if (np && spi->cs_gpiod)
- 			internal_cs = false;
--		}
--
--		if (retval) {
--			dev_err(&spi->dev, "GPIO %d setup failed (%d)\n",
--				spi->cs_gpio, retval);
--			return retval;
--		}
- 
--		if (internal_cs) {
-+		if (internal_cs)
- 			set_io_bits(dspi->base + SPIPC0, 1 << spi->chip_select);
--		}
- 	}
- 
- 	if (spi->mode & SPI_READY)
-@@ -962,6 +954,7 @@ static int davinci_spi_probe(struct platform_device *pdev)
- 	if (ret)
- 		goto free_master;
- 
-+	master->use_gpio_descriptors = true;
- 	master->dev.of_node = pdev->dev.of_node;
- 	master->bus_num = pdev->id;
- 	master->num_chipselect = pdata->num_chipselect;
-@@ -980,27 +973,6 @@ static int davinci_spi_probe(struct platform_device *pdev)
- 	if (dspi->version == SPI_VERSION_2)
- 		dspi->bitbang.flags |= SPI_READY;
- 
--	if (pdev->dev.of_node) {
--		int i;
--
--		for (i = 0; i < pdata->num_chipselect; i++) {
--			int cs_gpio = of_get_named_gpio(pdev->dev.of_node,
--							"cs-gpios", i);
--
--			if (cs_gpio == -EPROBE_DEFER) {
--				ret = cs_gpio;
--				goto free_clk;
--			}
--
--			if (gpio_is_valid(cs_gpio)) {
--				ret = devm_gpio_request(&pdev->dev, cs_gpio,
--							dev_name(&pdev->dev));
--				if (ret)
--					goto free_clk;
--			}
--		}
--	}
--
- 	dspi->bitbang.txrx_bufs = davinci_spi_bufs;
- 
- 	ret = davinci_spi_request_dma(dspi);
-diff --git a/drivers/spi/spi-dw-mmio.c b/drivers/spi/spi-dw-mmio.c
-index d0dd7814e997..4bd59a93d988 100644
---- a/drivers/spi/spi-dw-mmio.c
-+++ b/drivers/spi/spi-dw-mmio.c
-@@ -18,7 +18,6 @@
- #include <linux/mfd/syscon.h>
- #include <linux/module.h>
- #include <linux/of.h>
--#include <linux/of_gpio.h>
- #include <linux/of_platform.h>
- #include <linux/acpi.h>
- #include <linux/property.h>
-@@ -185,27 +184,6 @@ static int dw_spi_mmio_probe(struct platform_device *pdev)
- 
- 	dws->num_cs = num_cs;
- 
--	if (pdev->dev.of_node) {
--		int i;
--
--		for (i = 0; i < dws->num_cs; i++) {
--			int cs_gpio = of_get_named_gpio(pdev->dev.of_node,
--					"cs-gpios", i);
--
--			if (cs_gpio == -EPROBE_DEFER) {
--				ret = cs_gpio;
--				goto out;
--			}
--
--			if (gpio_is_valid(cs_gpio)) {
--				ret = devm_gpio_request(&pdev->dev, cs_gpio,
--						dev_name(&pdev->dev));
--				if (ret)
--					goto out;
--			}
--		}
--	}
--
- 	init_func = device_get_match_data(&pdev->dev);
- 	if (init_func) {
- 		ret = init_func(pdev, dwsmmio);
-diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c
-index 2e822a56576a..ac81025f86ab 100644
---- a/drivers/spi/spi-dw.c
-+++ b/drivers/spi/spi-dw.c
-@@ -20,7 +20,6 @@
- #include <linux/delay.h>
- #include <linux/slab.h>
- #include <linux/spi/spi.h>
--#include <linux/gpio.h>
- 
- #include "spi-dw.h"
- 
-@@ -54,41 +53,41 @@ static ssize_t dw_spi_show_regs(struct file *file, char __user *user_buf,
- 	if (!buf)
- 		return 0;
- 
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"%s registers:\n", dev_name(&dws->master->dev));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"=================================\n");
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"CTRL0: \t\t0x%08x\n", dw_readl(dws, DW_SPI_CTRL0));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"CTRL1: \t\t0x%08x\n", dw_readl(dws, DW_SPI_CTRL1));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"SSIENR: \t0x%08x\n", dw_readl(dws, DW_SPI_SSIENR));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"SER: \t\t0x%08x\n", dw_readl(dws, DW_SPI_SER));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"BAUDR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_BAUDR));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"TXFTLR: \t0x%08x\n", dw_readl(dws, DW_SPI_TXFLTR));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"RXFTLR: \t0x%08x\n", dw_readl(dws, DW_SPI_RXFLTR));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"TXFLR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_TXFLR));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"RXFLR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_RXFLR));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"SR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_SR));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"IMR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_IMR));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"ISR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_ISR));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"DMACR: \t\t0x%08x\n", dw_readl(dws, DW_SPI_DMACR));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"DMATDLR: \t0x%08x\n", dw_readl(dws, DW_SPI_DMATDLR));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"DMARDLR: \t0x%08x\n", dw_readl(dws, DW_SPI_DMARDLR));
--	len += snprintf(buf + len, SPI_REGS_BUFSIZE - len,
-+	len += scnprintf(buf + len, SPI_REGS_BUFSIZE - len,
- 			"=================================\n");
- 
- 	ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
-@@ -138,11 +137,10 @@ void dw_spi_set_cs(struct spi_device *spi, bool enable)
- 	struct dw_spi *dws = spi_controller_get_devdata(spi->controller);
- 	struct chip_data *chip = spi_get_ctldata(spi);
- 
--	/* Chip select logic is inverted from spi_set_cs() */
- 	if (chip && chip->cs_control)
--		chip->cs_control(!enable);
-+		chip->cs_control(enable);
- 
--	if (!enable)
-+	if (enable)
- 		dw_writel(dws, DW_SPI_SER, BIT(spi->chip_select));
- 	else if (dws->cs_override)
- 		dw_writel(dws, DW_SPI_SER, 0);
-@@ -317,7 +315,8 @@ static int dw_spi_transfer_one(struct spi_controller *master,
- 	/* Default SPI mode is SCPOL = 0, SCPH = 0 */
- 	cr0 = (transfer->bits_per_word - 1)
- 		| (chip->type << SPI_FRF_OFFSET)
--		| (spi->mode << SPI_MODE_OFFSET)
-+		| ((((spi->mode & SPI_CPOL) ? 1 : 0) << SPI_SCOL_OFFSET) |
-+			(((spi->mode & SPI_CPHA) ? 1 : 0) << SPI_SCPH_OFFSET))
- 		| (chip->tmode << SPI_TMOD_OFFSET);
- 
- 	/*
-@@ -397,7 +396,6 @@ static int dw_spi_setup(struct spi_device *spi)
- {
- 	struct dw_spi_chip *chip_info = NULL;
- 	struct chip_data *chip;
--	int ret;
- 
- 	/* Only alloc on first setup */
- 	chip = spi_get_ctldata(spi);
-@@ -425,13 +423,6 @@ static int dw_spi_setup(struct spi_device *spi)
- 
- 	chip->tmode = SPI_TMOD_TR;
- 
--	if (gpio_is_valid(spi->cs_gpio)) {
--		ret = gpio_direction_output(spi->cs_gpio,
--				!(spi->mode & SPI_CS_HIGH));
--		if (ret)
--			return ret;
--	}
--
- 	return 0;
- }
- 
-@@ -496,6 +487,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws)
- 		goto err_free_master;
- 	}
- 
-+	master->use_gpio_descriptors = true;
- 	master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LOOP;
- 	master->bits_per_word_mask =  SPI_BPW_RANGE_MASK(4, 16);
- 	master->bus_num = dws->bus_num;
-diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
-index 5e10dc5c93a5..53335ccc98f6 100644
---- a/drivers/spi/spi-fsl-dspi.c
-+++ b/drivers/spi/spi-fsl-dspi.c
-@@ -67,7 +67,7 @@
- #define SPI_SR			0x2c
- #define SPI_SR_EOQF		0x10000000
- #define SPI_SR_TCFQF		0x80000000
--#define SPI_SR_CLEAR		0xdaad0000
-+#define SPI_SR_CLEAR		0x9aaf0000
- 
- #define SPI_RSER_TFFFE		BIT(25)
- #define SPI_RSER_TFFFD		BIT(24)
-@@ -233,6 +233,9 @@ static u32 dspi_pop_tx_pushr(struct fsl_dspi *dspi)
- {
- 	u16 cmd = dspi->tx_cmd, data = dspi_pop_tx(dspi);
- 
-+	if (spi_controller_is_slave(dspi->master))
-+		return data;
-+
- 	if (dspi->len > 0)
- 		cmd |= SPI_PUSHR_CMD_CONT;
- 	return cmd << 16 | data;
-@@ -329,6 +332,11 @@ static int dspi_next_xfer_dma_submit(struct fsl_dspi *dspi)
- 	dma_async_issue_pending(dma->chan_rx);
- 	dma_async_issue_pending(dma->chan_tx);
- 
-+	if (spi_controller_is_slave(dspi->master)) {
-+		wait_for_completion_interruptible(&dspi->dma->cmd_rx_complete);
-+		return 0;
-+	}
-+
- 	time_left = wait_for_completion_timeout(&dspi->dma->cmd_tx_complete,
- 					DMA_COMPLETION_TIMEOUT);
- 	if (time_left == 0) {
-@@ -798,14 +806,18 @@ static int dspi_setup(struct spi_device *spi)
- 	ns_delay_scale(&pasc, &asc, sck_cs_delay, clkrate);
- 
- 	chip->ctar_val = SPI_CTAR_CPOL(spi->mode & SPI_CPOL ? 1 : 0)
--		| SPI_CTAR_CPHA(spi->mode & SPI_CPHA ? 1 : 0)
--		| SPI_CTAR_LSBFE(spi->mode & SPI_LSB_FIRST ? 1 : 0)
--		| SPI_CTAR_PCSSCK(pcssck)
--		| SPI_CTAR_CSSCK(cssck)
--		| SPI_CTAR_PASC(pasc)
--		| SPI_CTAR_ASC(asc)
--		| SPI_CTAR_PBR(pbr)
--		| SPI_CTAR_BR(br);
-+		| SPI_CTAR_CPHA(spi->mode & SPI_CPHA ? 1 : 0);
-+
-+	if (!spi_controller_is_slave(dspi->master)) {
-+		chip->ctar_val |= SPI_CTAR_LSBFE(spi->mode &
-+						 SPI_LSB_FIRST ? 1 : 0)
-+			| SPI_CTAR_PCSSCK(pcssck)
-+			| SPI_CTAR_CSSCK(cssck)
-+			| SPI_CTAR_PASC(pasc)
-+			| SPI_CTAR_ASC(asc)
-+			| SPI_CTAR_PBR(pbr)
-+			| SPI_CTAR_BR(br);
-+	}
- 
- 	spi_set_ctldata(spi, chip);
- 
-@@ -970,8 +982,13 @@ static const struct regmap_config dspi_xspi_regmap_config[] = {
- 
- static void dspi_init(struct fsl_dspi *dspi)
- {
--	regmap_write(dspi->regmap, SPI_MCR, SPI_MCR_MASTER | SPI_MCR_PCSIS |
--		     (dspi->devtype_data->xspi_mode ? SPI_MCR_XSPI : 0));
-+	unsigned int mcr = SPI_MCR_PCSIS |
-+		(dspi->devtype_data->xspi_mode ? SPI_MCR_XSPI : 0);
-+
-+	if (!spi_controller_is_slave(dspi->master))
-+		mcr |= SPI_MCR_MASTER;
-+
-+	regmap_write(dspi->regmap, SPI_MCR, mcr);
- 	regmap_write(dspi->regmap, SPI_SR, SPI_SR_CLEAR);
- 	if (dspi->devtype_data->xspi_mode)
- 		regmap_write(dspi->regmap, SPI_CTARE(0),
-@@ -1027,6 +1044,9 @@ static int dspi_probe(struct platform_device *pdev)
- 		}
- 		master->bus_num = bus_num;
- 
-+		if (of_property_read_bool(np, "spi-slave"))
-+			master->slave = true;
-+
- 		dspi->devtype_data = of_device_get_match_data(&pdev->dev);
- 		if (!dspi->devtype_data) {
- 			dev_err(&pdev->dev, "can't get devtype_data\n");
-diff --git a/drivers/spi/spi-fsl-lpspi.c b/drivers/spi/spi-fsl-lpspi.c
-index 08dcc3c22e88..391863914043 100644
---- a/drivers/spi/spi-fsl-lpspi.c
-+++ b/drivers/spi/spi-fsl-lpspi.c
-@@ -48,10 +48,13 @@
- #define CR_RTF		BIT(8)
- #define CR_RST		BIT(1)
- #define CR_MEN		BIT(0)
-+#define SR_MBF		BIT(24)
- #define SR_TCF		BIT(10)
-+#define SR_FCF		BIT(9)
- #define SR_RDF		BIT(1)
- #define SR_TDF		BIT(0)
- #define IER_TCIE	BIT(10)
-+#define IER_FCIE	BIT(9)
- #define IER_RDIE	BIT(1)
- #define IER_TDIE	BIT(0)
- #define CFGR1_PCSCFG	BIT(27)
-@@ -59,6 +62,7 @@
- #define CFGR1_PCSPOL	BIT(8)
- #define CFGR1_NOSTALL	BIT(3)
- #define CFGR1_MASTER	BIT(0)
-+#define FSR_RXCOUNT	(BIT(16)|BIT(17)|BIT(18))
- #define RSR_RXEMPTY	BIT(1)
- #define TCR_CPOL	BIT(31)
- #define TCR_CPHA	BIT(30)
-@@ -161,28 +165,10 @@ static int lpspi_unprepare_xfer_hardware(struct spi_controller *controller)
- 	return 0;
- }
- 
--static int fsl_lpspi_txfifo_empty(struct fsl_lpspi_data *fsl_lpspi)
--{
--	u32 txcnt;
--	unsigned long orig_jiffies = jiffies;
--
--	do {
--		txcnt = readl(fsl_lpspi->base + IMX7ULP_FSR) & 0xff;
--
--		if (time_after(jiffies, orig_jiffies + msecs_to_jiffies(500))) {
--			dev_dbg(fsl_lpspi->dev, "txfifo empty timeout\n");
--			return -ETIMEDOUT;
--		}
--		cond_resched();
--
--	} while (txcnt);
--
--	return 0;
--}
--
- static void fsl_lpspi_write_tx_fifo(struct fsl_lpspi_data *fsl_lpspi)
- {
- 	u8 txfifo_cnt;
-+	u32 temp;
- 
- 	txfifo_cnt = readl(fsl_lpspi->base + IMX7ULP_FSR) & 0xff;
- 
-@@ -193,9 +179,15 @@ static void fsl_lpspi_write_tx_fifo(struct fsl_lpspi_data *fsl_lpspi)
- 		txfifo_cnt++;
- 	}
- 
--	if (!fsl_lpspi->remain && (txfifo_cnt < fsl_lpspi->txfifosize))
--		writel(0, fsl_lpspi->base + IMX7ULP_TDR);
--	else
-+	if (txfifo_cnt < fsl_lpspi->txfifosize) {
-+		if (!fsl_lpspi->is_slave) {
-+			temp = readl(fsl_lpspi->base + IMX7ULP_TCR);
-+			temp &= ~TCR_CONTC;
-+			writel(temp, fsl_lpspi->base + IMX7ULP_TCR);
-+		}
-+
-+		fsl_lpspi_intctrl(fsl_lpspi, IER_FCIE);
-+	} else
- 		fsl_lpspi_intctrl(fsl_lpspi, IER_TDIE);
- }
- 
-@@ -276,10 +268,6 @@ static int fsl_lpspi_config(struct fsl_lpspi_data *fsl_lpspi)
- 	u32 temp;
- 	int ret;
- 
--	temp = CR_RST;
--	writel(temp, fsl_lpspi->base + IMX7ULP_CR);
--	writel(0, fsl_lpspi->base + IMX7ULP_CR);
--
- 	if (!fsl_lpspi->is_slave) {
- 		ret = fsl_lpspi_set_bitrate(fsl_lpspi);
- 		if (ret)
-@@ -370,6 +358,24 @@ static int fsl_lpspi_wait_for_completion(struct spi_controller *controller)
- 	return 0;
- }
- 
-+static int fsl_lpspi_reset(struct fsl_lpspi_data *fsl_lpspi)
-+{
-+	u32 temp;
-+
-+	/* Disable all interrupt */
-+	fsl_lpspi_intctrl(fsl_lpspi, 0);
-+
-+	/* W1C for all flags in SR */
-+	temp = 0x3F << 8;
-+	writel(temp, fsl_lpspi->base + IMX7ULP_SR);
-+
-+	/* Clear FIFO and disable module */
-+	temp = CR_RRF | CR_RTF;
-+	writel(temp, fsl_lpspi->base + IMX7ULP_CR);
-+
-+	return 0;
-+}
-+
- static int fsl_lpspi_transfer_one(struct spi_controller *controller,
- 				  struct spi_device *spi,
- 				  struct spi_transfer *t)
-@@ -391,11 +397,7 @@ static int fsl_lpspi_transfer_one(struct spi_controller *controller,
- 	if (ret)
- 		return ret;
- 
--	ret = fsl_lpspi_txfifo_empty(fsl_lpspi);
--	if (ret)
--		return ret;
--
--	fsl_lpspi_read_rx_fifo(fsl_lpspi);
-+	fsl_lpspi_reset(fsl_lpspi);
- 
- 	return 0;
- }
-@@ -408,7 +410,6 @@ static int fsl_lpspi_transfer_one_msg(struct spi_controller *controller,
- 	struct spi_device *spi = msg->spi;
- 	struct spi_transfer *xfer;
- 	bool is_first_xfer = true;
--	u32 temp;
- 	int ret = 0;
- 
- 	msg->status = 0;
-@@ -428,13 +429,6 @@ static int fsl_lpspi_transfer_one_msg(struct spi_controller *controller,
- 	}
- 
- complete:
--	if (!fsl_lpspi->is_slave) {
--		/* de-assert SS, then finalize current message */
--		temp = readl(fsl_lpspi->base + IMX7ULP_TCR);
--		temp &= ~TCR_CONTC;
--		writel(temp, fsl_lpspi->base + IMX7ULP_TCR);
--	}
--
- 	msg->status = ret;
- 	spi_finalize_current_message(controller);
- 
-@@ -443,20 +437,30 @@ static int fsl_lpspi_transfer_one_msg(struct spi_controller *controller,
- 
- static irqreturn_t fsl_lpspi_isr(int irq, void *dev_id)
- {
-+	u32 temp_SR, temp_IER;
- 	struct fsl_lpspi_data *fsl_lpspi = dev_id;
--	u32 temp;
- 
-+	temp_IER = readl(fsl_lpspi->base + IMX7ULP_IER);
- 	fsl_lpspi_intctrl(fsl_lpspi, 0);
--	temp = readl(fsl_lpspi->base + IMX7ULP_SR);
-+	temp_SR = readl(fsl_lpspi->base + IMX7ULP_SR);
- 
- 	fsl_lpspi_read_rx_fifo(fsl_lpspi);
- 
--	if (temp & SR_TDF) {
-+	if ((temp_SR & SR_TDF) && (temp_IER & IER_TDIE)) {
- 		fsl_lpspi_write_tx_fifo(fsl_lpspi);
-+		return IRQ_HANDLED;
-+	}
- 
--		if (!fsl_lpspi->remain)
--			complete(&fsl_lpspi->xfer_done);
-+	if (temp_SR & SR_MBF ||
-+	    readl(fsl_lpspi->base + IMX7ULP_FSR) & FSR_RXCOUNT) {
-+		writel(SR_FCF, fsl_lpspi->base + IMX7ULP_SR);
-+		fsl_lpspi_intctrl(fsl_lpspi, IER_FCIE);
-+		return IRQ_HANDLED;
-+	}
- 
-+	if (temp_SR & SR_FCF && (temp_IER & IER_FCIE)) {
-+		writel(SR_FCF, fsl_lpspi->base + IMX7ULP_SR);
-+			complete(&fsl_lpspi->xfer_done);
- 		return IRQ_HANDLED;
- 	}
- 
-diff --git a/drivers/spi/spi-fsl-qspi.c b/drivers/spi/spi-fsl-qspi.c
-new file mode 100644
-index 000000000000..6a713f78a62e
---- /dev/null
-+++ b/drivers/spi/spi-fsl-qspi.c
-@@ -0,0 +1,966 @@
-+// SPDX-License-Identifier: GPL-2.0+
-+
-+/*
-+ * Freescale QuadSPI driver.
-+ *
-+ * Copyright (C) 2013 Freescale Semiconductor, Inc.
-+ * Copyright (C) 2018 Bootlin
-+ * Copyright (C) 2018 exceet electronics GmbH
-+ * Copyright (C) 2018 Kontron Electronics GmbH
-+ *
-+ * Transition to SPI MEM interface:
-+ * Authors:
-+ *     Boris Brezillon <bbrezillon@kernel.org>
-+ *     Frieder Schrempf <frieder.schrempf@kontron.de>
-+ *     Yogesh Gaur <yogeshnarayan.gaur@nxp.com>
-+ *     Suresh Gupta <suresh.gupta@nxp.com>
-+ *
-+ * Based on the original fsl-quadspi.c spi-nor driver:
-+ * Author: Freescale Semiconductor, Inc.
-+ *
-+ */
-+
-+#include <linux/bitops.h>
-+#include <linux/clk.h>
-+#include <linux/completion.h>
-+#include <linux/delay.h>
-+#include <linux/err.h>
-+#include <linux/errno.h>
-+#include <linux/interrupt.h>
-+#include <linux/io.h>
-+#include <linux/iopoll.h>
-+#include <linux/jiffies.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/mutex.h>
-+#include <linux/of.h>
-+#include <linux/of_device.h>
-+#include <linux/platform_device.h>
-+#include <linux/pm_qos.h>
-+#include <linux/sizes.h>
-+
-+#include <linux/spi/spi.h>
-+#include <linux/spi/spi-mem.h>
-+
-+/*
-+ * The driver only uses one single LUT entry, that is updated on
-+ * each call of exec_op(). Index 0 is preset at boot with a basic
-+ * read operation, so let's use the last entry (15).
-+ */
-+#define	SEQID_LUT			15
-+
-+/* Registers used by the driver */
-+#define QUADSPI_MCR			0x00
-+#define QUADSPI_MCR_RESERVED_MASK	GENMASK(19, 16)
-+#define QUADSPI_MCR_MDIS_MASK		BIT(14)
-+#define QUADSPI_MCR_CLR_TXF_MASK	BIT(11)
-+#define QUADSPI_MCR_CLR_RXF_MASK	BIT(10)
-+#define QUADSPI_MCR_DDR_EN_MASK		BIT(7)
-+#define QUADSPI_MCR_END_CFG_MASK	GENMASK(3, 2)
-+#define QUADSPI_MCR_SWRSTHD_MASK	BIT(1)
-+#define QUADSPI_MCR_SWRSTSD_MASK	BIT(0)
-+
-+#define QUADSPI_IPCR			0x08
-+#define QUADSPI_IPCR_SEQID(x)		((x) << 24)
-+
-+#define QUADSPI_BUF3CR			0x1c
-+#define QUADSPI_BUF3CR_ALLMST_MASK	BIT(31)
-+#define QUADSPI_BUF3CR_ADATSZ(x)	((x) << 8)
-+#define QUADSPI_BUF3CR_ADATSZ_MASK	GENMASK(15, 8)
-+
-+#define QUADSPI_BFGENCR			0x20
-+#define QUADSPI_BFGENCR_SEQID(x)	((x) << 12)
-+
-+#define QUADSPI_BUF0IND			0x30
-+#define QUADSPI_BUF1IND			0x34
-+#define QUADSPI_BUF2IND			0x38
-+#define QUADSPI_SFAR			0x100
-+
-+#define QUADSPI_SMPR			0x108
-+#define QUADSPI_SMPR_DDRSMP_MASK	GENMASK(18, 16)
-+#define QUADSPI_SMPR_FSDLY_MASK		BIT(6)
-+#define QUADSPI_SMPR_FSPHS_MASK		BIT(5)
-+#define QUADSPI_SMPR_HSENA_MASK		BIT(0)
-+
-+#define QUADSPI_RBCT			0x110
-+#define QUADSPI_RBCT_WMRK_MASK		GENMASK(4, 0)
-+#define QUADSPI_RBCT_RXBRD_USEIPS	BIT(8)
-+
-+#define QUADSPI_TBDR			0x154
-+
-+#define QUADSPI_SR			0x15c
-+#define QUADSPI_SR_IP_ACC_MASK		BIT(1)
-+#define QUADSPI_SR_AHB_ACC_MASK		BIT(2)
-+
-+#define QUADSPI_FR			0x160
-+#define QUADSPI_FR_TFF_MASK		BIT(0)
-+
-+#define QUADSPI_SPTRCLR			0x16c
-+#define QUADSPI_SPTRCLR_IPPTRC		BIT(8)
-+#define QUADSPI_SPTRCLR_BFPTRC		BIT(0)
-+
-+#define QUADSPI_SFA1AD			0x180
-+#define QUADSPI_SFA2AD			0x184
-+#define QUADSPI_SFB1AD			0x188
-+#define QUADSPI_SFB2AD			0x18c
-+#define QUADSPI_RBDR(x)			(0x200 + ((x) * 4))
-+
-+#define QUADSPI_LUTKEY			0x300
-+#define QUADSPI_LUTKEY_VALUE		0x5AF05AF0
-+
-+#define QUADSPI_LCKCR			0x304
-+#define QUADSPI_LCKER_LOCK		BIT(0)
-+#define QUADSPI_LCKER_UNLOCK		BIT(1)
-+
-+#define QUADSPI_RSER			0x164
-+#define QUADSPI_RSER_TFIE		BIT(0)
-+
-+#define QUADSPI_LUT_BASE		0x310
-+#define QUADSPI_LUT_OFFSET		(SEQID_LUT * 4 * 4)
-+#define QUADSPI_LUT_REG(idx) \
-+	(QUADSPI_LUT_BASE + QUADSPI_LUT_OFFSET + (idx) * 4)
-+
-+/* Instruction set for the LUT register */
-+#define LUT_STOP		0
-+#define LUT_CMD			1
-+#define LUT_ADDR		2
-+#define LUT_DUMMY		3
-+#define LUT_MODE		4
-+#define LUT_MODE2		5
-+#define LUT_MODE4		6
-+#define LUT_FSL_READ		7
-+#define LUT_FSL_WRITE		8
-+#define LUT_JMP_ON_CS		9
-+#define LUT_ADDR_DDR		10
-+#define LUT_MODE_DDR		11
-+#define LUT_MODE2_DDR		12
-+#define LUT_MODE4_DDR		13
-+#define LUT_FSL_READ_DDR	14
-+#define LUT_FSL_WRITE_DDR	15
-+#define LUT_DATA_LEARN		16
-+
-+/*
-+ * The PAD definitions for LUT register.
-+ *
-+ * The pad stands for the number of IO lines [0:3].
-+ * For example, the quad read needs four IO lines,
-+ * so you should use LUT_PAD(4).
-+ */
-+#define LUT_PAD(x) (fls(x) - 1)
-+
-+/*
-+ * Macro for constructing the LUT entries with the following
-+ * register layout:
-+ *
-+ *  ---------------------------------------------------
-+ *  | INSTR1 | PAD1 | OPRND1 | INSTR0 | PAD0 | OPRND0 |
-+ *  ---------------------------------------------------
-+ */
-+#define LUT_DEF(idx, ins, pad, opr)					\
-+	((((ins) << 10) | ((pad) << 8) | (opr)) << (((idx) % 2) * 16))
-+
-+/* Controller needs driver to swap endianness */
-+#define QUADSPI_QUIRK_SWAP_ENDIAN	BIT(0)
-+
-+/* Controller needs 4x internal clock */
-+#define QUADSPI_QUIRK_4X_INT_CLK	BIT(1)
-+
-+/*
-+ * TKT253890, the controller needs the driver to fill the txfifo with
-+ * 16 bytes at least to trigger a data transfer, even though the extra
-+ * data won't be transferred.
-+ */
-+#define QUADSPI_QUIRK_TKT253890		BIT(2)
-+
-+/* TKT245618, the controller cannot wake up from wait mode */
-+#define QUADSPI_QUIRK_TKT245618		BIT(3)
-+
-+/*
-+ * Controller adds QSPI_AMBA_BASE (base address of the mapped memory)
-+ * internally. No need to add it when setting SFXXAD and SFAR registers
-+ */
-+#define QUADSPI_QUIRK_BASE_INTERNAL	BIT(4)
-+
-+struct fsl_qspi_devtype_data {
-+	unsigned int rxfifo;
-+	unsigned int txfifo;
-+	unsigned int ahb_buf_size;
-+	unsigned int quirks;
-+	bool little_endian;
-+};
-+
-+static const struct fsl_qspi_devtype_data vybrid_data = {
-+	.rxfifo = SZ_128,
-+	.txfifo = SZ_64,
-+	.ahb_buf_size = SZ_1K,
-+	.quirks = QUADSPI_QUIRK_SWAP_ENDIAN,
-+	.little_endian = true,
-+};
-+
-+static const struct fsl_qspi_devtype_data imx6sx_data = {
-+	.rxfifo = SZ_128,
-+	.txfifo = SZ_512,
-+	.ahb_buf_size = SZ_1K,
-+	.quirks = QUADSPI_QUIRK_4X_INT_CLK | QUADSPI_QUIRK_TKT245618,
-+	.little_endian = true,
-+};
-+
-+static const struct fsl_qspi_devtype_data imx7d_data = {
-+	.rxfifo = SZ_512,
-+	.txfifo = SZ_512,
-+	.ahb_buf_size = SZ_1K,
-+	.quirks = QUADSPI_QUIRK_TKT253890 | QUADSPI_QUIRK_4X_INT_CLK,
-+	.little_endian = true,
-+};
-+
-+static const struct fsl_qspi_devtype_data imx6ul_data = {
-+	.rxfifo = SZ_128,
-+	.txfifo = SZ_512,
-+	.ahb_buf_size = SZ_1K,
-+	.quirks = QUADSPI_QUIRK_TKT253890 | QUADSPI_QUIRK_4X_INT_CLK,
-+	.little_endian = true,
-+};
-+
-+static const struct fsl_qspi_devtype_data ls1021a_data = {
-+	.rxfifo = SZ_128,
-+	.txfifo = SZ_64,
-+	.ahb_buf_size = SZ_1K,
-+	.quirks = 0,
-+	.little_endian = false,
-+};
-+
-+static const struct fsl_qspi_devtype_data ls2080a_data = {
-+	.rxfifo = SZ_128,
-+	.txfifo = SZ_64,
-+	.ahb_buf_size = SZ_1K,
-+	.quirks = QUADSPI_QUIRK_TKT253890 | QUADSPI_QUIRK_BASE_INTERNAL,
-+	.little_endian = true,
-+};
-+
-+struct fsl_qspi {
-+	void __iomem *iobase;
-+	void __iomem *ahb_addr;
-+	u32 memmap_phy;
-+	struct clk *clk, *clk_en;
-+	struct device *dev;
-+	struct completion c;
-+	const struct fsl_qspi_devtype_data *devtype_data;
-+	struct mutex lock;
-+	struct pm_qos_request pm_qos_req;
-+	int selected;
-+};
-+
-+static inline int needs_swap_endian(struct fsl_qspi *q)
-+{
-+	return q->devtype_data->quirks & QUADSPI_QUIRK_SWAP_ENDIAN;
-+}
-+
-+static inline int needs_4x_clock(struct fsl_qspi *q)
-+{
-+	return q->devtype_data->quirks & QUADSPI_QUIRK_4X_INT_CLK;
-+}
-+
-+static inline int needs_fill_txfifo(struct fsl_qspi *q)
-+{
-+	return q->devtype_data->quirks & QUADSPI_QUIRK_TKT253890;
-+}
-+
-+static inline int needs_wakeup_wait_mode(struct fsl_qspi *q)
-+{
-+	return q->devtype_data->quirks & QUADSPI_QUIRK_TKT245618;
-+}
-+
-+static inline int needs_amba_base_offset(struct fsl_qspi *q)
-+{
-+	return !(q->devtype_data->quirks & QUADSPI_QUIRK_BASE_INTERNAL);
-+}
-+
-+/*
-+ * An IC bug makes it necessary to rearrange the 32-bit data.
-+ * Later chips, such as IMX6SLX, have fixed this bug.
-+ */
-+static inline u32 fsl_qspi_endian_xchg(struct fsl_qspi *q, u32 a)
-+{
-+	return needs_swap_endian(q) ? __swab32(a) : a;
-+}
-+
-+/*
-+ * R/W functions for big- or little-endian registers:
-+ * The QSPI controller's endianness is independent of
-+ * the CPU core's endianness. So far, although the CPU
-+ * core is little-endian the QSPI controller can use
-+ * big-endian or little-endian.
-+ */
-+static void qspi_writel(struct fsl_qspi *q, u32 val, void __iomem *addr)
-+{
-+	if (q->devtype_data->little_endian)
-+		iowrite32(val, addr);
-+	else
-+		iowrite32be(val, addr);
-+}
-+
-+static u32 qspi_readl(struct fsl_qspi *q, void __iomem *addr)
-+{
-+	if (q->devtype_data->little_endian)
-+		return ioread32(addr);
-+
-+	return ioread32be(addr);
-+}
-+
-+static irqreturn_t fsl_qspi_irq_handler(int irq, void *dev_id)
-+{
-+	struct fsl_qspi *q = dev_id;
-+	u32 reg;
-+
-+	/* clear interrupt */
-+	reg = qspi_readl(q, q->iobase + QUADSPI_FR);
-+	qspi_writel(q, reg, q->iobase + QUADSPI_FR);
-+
-+	if (reg & QUADSPI_FR_TFF_MASK)
-+		complete(&q->c);
-+
-+	dev_dbg(q->dev, "QUADSPI_FR : 0x%.8x:0x%.8x\n", 0, reg);
-+	return IRQ_HANDLED;
-+}
-+
-+static int fsl_qspi_check_buswidth(struct fsl_qspi *q, u8 width)
-+{
-+	switch (width) {
-+	case 1:
-+	case 2:
-+	case 4:
-+		return 0;
-+	}
-+
-+	return -ENOTSUPP;
-+}
-+
-+static bool fsl_qspi_supports_op(struct spi_mem *mem,
-+				 const struct spi_mem_op *op)
-+{
-+	struct fsl_qspi *q = spi_controller_get_devdata(mem->spi->master);
-+	int ret;
-+
-+	ret = fsl_qspi_check_buswidth(q, op->cmd.buswidth);
-+
-+	if (op->addr.nbytes)
-+		ret |= fsl_qspi_check_buswidth(q, op->addr.buswidth);
-+
-+	if (op->dummy.nbytes)
-+		ret |= fsl_qspi_check_buswidth(q, op->dummy.buswidth);
-+
-+	if (op->data.nbytes)
-+		ret |= fsl_qspi_check_buswidth(q, op->data.buswidth);
-+
-+	if (ret)
-+		return false;
-+
-+	/*
-+	 * The number of instructions needed for the op, needs
-+	 * to fit into a single LUT entry.
-+	 */
-+	if (op->addr.nbytes +
-+	   (op->dummy.nbytes ? 1:0) +
-+	   (op->data.nbytes ? 1:0) > 6)
-+		return false;
-+
-+	/* Max 64 dummy clock cycles supported */
-+	if (op->dummy.nbytes &&
-+	    (op->dummy.nbytes * 8 / op->dummy.buswidth > 64))
-+		return false;
-+
-+	/* Max data length, check controller limits and alignment */
-+	if (op->data.dir == SPI_MEM_DATA_IN &&
-+	    (op->data.nbytes > q->devtype_data->ahb_buf_size ||
-+	     (op->data.nbytes > q->devtype_data->rxfifo - 4 &&
-+	      !IS_ALIGNED(op->data.nbytes, 8))))
-+		return false;
-+
-+	if (op->data.dir == SPI_MEM_DATA_OUT &&
-+	    op->data.nbytes > q->devtype_data->txfifo)
-+		return false;
-+
-+	return true;
-+}
-+
-+static void fsl_qspi_prepare_lut(struct fsl_qspi *q,
-+				 const struct spi_mem_op *op)
-+{
-+	void __iomem *base = q->iobase;
-+	u32 lutval[4] = {};
-+	int lutidx = 1, i;
-+
-+	lutval[0] |= LUT_DEF(0, LUT_CMD, LUT_PAD(op->cmd.buswidth),
-+			     op->cmd.opcode);
-+
-+	/*
-+	 * For some unknown reason, using LUT_ADDR doesn't work in some
-+	 * cases (at least with only one byte long addresses), so
-+	 * let's use LUT_MODE to write the address bytes one by one
-+	 */
-+	for (i = 0; i < op->addr.nbytes; i++) {
-+		u8 addrbyte = op->addr.val >> (8 * (op->addr.nbytes - i - 1));
-+
-+		lutval[lutidx / 2] |= LUT_DEF(lutidx, LUT_MODE,
-+					      LUT_PAD(op->addr.buswidth),
-+					      addrbyte);
-+		lutidx++;
-+	}
-+
-+	if (op->dummy.nbytes) {
-+		lutval[lutidx / 2] |= LUT_DEF(lutidx, LUT_DUMMY,
-+					      LUT_PAD(op->dummy.buswidth),
-+					      op->dummy.nbytes * 8 /
-+					      op->dummy.buswidth);
-+		lutidx++;
-+	}
-+
-+	if (op->data.nbytes) {
-+		lutval[lutidx / 2] |= LUT_DEF(lutidx,
-+					      op->data.dir == SPI_MEM_DATA_IN ?
-+					      LUT_FSL_READ : LUT_FSL_WRITE,
-+					      LUT_PAD(op->data.buswidth),
-+					      0);
-+		lutidx++;
-+	}
-+
-+	lutval[lutidx / 2] |= LUT_DEF(lutidx, LUT_STOP, 0, 0);
-+
-+	/* unlock LUT */
-+	qspi_writel(q, QUADSPI_LUTKEY_VALUE, q->iobase + QUADSPI_LUTKEY);
-+	qspi_writel(q, QUADSPI_LCKER_UNLOCK, q->iobase + QUADSPI_LCKCR);
-+
-+	/* fill LUT */
-+	for (i = 0; i < ARRAY_SIZE(lutval); i++)
-+		qspi_writel(q, lutval[i], base + QUADSPI_LUT_REG(i));
-+
-+	/* lock LUT */
-+	qspi_writel(q, QUADSPI_LUTKEY_VALUE, q->iobase + QUADSPI_LUTKEY);
-+	qspi_writel(q, QUADSPI_LCKER_LOCK, q->iobase + QUADSPI_LCKCR);
-+}
-+
-+static int fsl_qspi_clk_prep_enable(struct fsl_qspi *q)
-+{
-+	int ret;
-+
-+	ret = clk_prepare_enable(q->clk_en);
-+	if (ret)
-+		return ret;
-+
-+	ret = clk_prepare_enable(q->clk);
-+	if (ret) {
-+		clk_disable_unprepare(q->clk_en);
-+		return ret;
-+	}
-+
-+	if (needs_wakeup_wait_mode(q))
-+		pm_qos_add_request(&q->pm_qos_req, PM_QOS_CPU_DMA_LATENCY, 0);
-+
-+	return 0;
-+}
-+
-+static void fsl_qspi_clk_disable_unprep(struct fsl_qspi *q)
-+{
-+	if (needs_wakeup_wait_mode(q))
-+		pm_qos_remove_request(&q->pm_qos_req);
-+
-+	clk_disable_unprepare(q->clk);
-+	clk_disable_unprepare(q->clk_en);
-+}
-+
-+/*
-+ * If we have changed the content of the flash by writing or erasing, or if we
-+ * read from flash with a different offset into the page buffer, we need to
-+ * invalidate the AHB buffer. If we do not do so, we may read out the wrong
-+ * data. The spec tells us reset the AHB domain and Serial Flash domain at
-+ * the same time.
-+ */
-+static void fsl_qspi_invalidate(struct fsl_qspi *q)
-+{
-+	u32 reg;
-+
-+	reg = qspi_readl(q, q->iobase + QUADSPI_MCR);
-+	reg |= QUADSPI_MCR_SWRSTHD_MASK | QUADSPI_MCR_SWRSTSD_MASK;
-+	qspi_writel(q, reg, q->iobase + QUADSPI_MCR);
-+
-+	/*
-+	 * The minimum delay : 1 AHB + 2 SFCK clocks.
-+	 * Delay 1 us is enough.
-+	 */
-+	udelay(1);
-+
-+	reg &= ~(QUADSPI_MCR_SWRSTHD_MASK | QUADSPI_MCR_SWRSTSD_MASK);
-+	qspi_writel(q, reg, q->iobase + QUADSPI_MCR);
-+}
-+
-+static void fsl_qspi_select_mem(struct fsl_qspi *q, struct spi_device *spi)
-+{
-+	unsigned long rate = spi->max_speed_hz;
-+	int ret;
-+
-+	if (q->selected == spi->chip_select)
-+		return;
-+
-+	if (needs_4x_clock(q))
-+		rate *= 4;
-+
-+	fsl_qspi_clk_disable_unprep(q);
-+
-+	ret = clk_set_rate(q->clk, rate);
-+	if (ret)
-+		return;
-+
-+	ret = fsl_qspi_clk_prep_enable(q);
-+	if (ret)
-+		return;
-+
-+	q->selected = spi->chip_select;
-+
-+	fsl_qspi_invalidate(q);
-+}
-+
-+static void fsl_qspi_read_ahb(struct fsl_qspi *q, const struct spi_mem_op *op)
-+{
-+	memcpy_fromio(op->data.buf.in,
-+		      q->ahb_addr + q->selected * q->devtype_data->ahb_buf_size,
-+		      op->data.nbytes);
-+}
-+
-+static void fsl_qspi_fill_txfifo(struct fsl_qspi *q,
-+				 const struct spi_mem_op *op)
-+{
-+	void __iomem *base = q->iobase;
-+	int i;
-+	u32 val;
-+
-+	for (i = 0; i < ALIGN_DOWN(op->data.nbytes, 4); i += 4) {
-+		memcpy(&val, op->data.buf.out + i, 4);
-+		val = fsl_qspi_endian_xchg(q, val);
-+		qspi_writel(q, val, base + QUADSPI_TBDR);
-+	}
-+
-+	if (i < op->data.nbytes) {
-+		memcpy(&val, op->data.buf.out + i, op->data.nbytes - i);
-+		val = fsl_qspi_endian_xchg(q, val);
-+		qspi_writel(q, val, base + QUADSPI_TBDR);
-+	}
-+
-+	if (needs_fill_txfifo(q)) {
-+		for (i = op->data.nbytes; i < 16; i += 4)
-+			qspi_writel(q, 0, base + QUADSPI_TBDR);
-+	}
-+}
-+
-+static void fsl_qspi_read_rxfifo(struct fsl_qspi *q,
-+			  const struct spi_mem_op *op)
-+{
-+	void __iomem *base = q->iobase;
-+	int i;
-+	u8 *buf = op->data.buf.in;
-+	u32 val;
-+
-+	for (i = 0; i < ALIGN_DOWN(op->data.nbytes, 4); i += 4) {
-+		val = qspi_readl(q, base + QUADSPI_RBDR(i / 4));
-+		val = fsl_qspi_endian_xchg(q, val);
-+		memcpy(buf + i, &val, 4);
-+	}
-+
-+	if (i < op->data.nbytes) {
-+		val = qspi_readl(q, base + QUADSPI_RBDR(i / 4));
-+		val = fsl_qspi_endian_xchg(q, val);
-+		memcpy(buf + i, &val, op->data.nbytes - i);
-+	}
-+}
-+
-+static int fsl_qspi_do_op(struct fsl_qspi *q, const struct spi_mem_op *op)
-+{
-+	void __iomem *base = q->iobase;
-+	int err = 0;
-+
-+	init_completion(&q->c);
-+
-+	/*
-+	 * Always start the sequence at the same index since we update
-+	 * the LUT at each exec_op() call. And also specify the DATA
-+	 * length, since it's has not been specified in the LUT.
-+	 */
-+	qspi_writel(q, op->data.nbytes | QUADSPI_IPCR_SEQID(SEQID_LUT),
-+		    base + QUADSPI_IPCR);
-+
-+	/* Wait for the interrupt. */
-+	if (!wait_for_completion_timeout(&q->c, msecs_to_jiffies(1000)))
-+		err = -ETIMEDOUT;
-+
-+	if (!err && op->data.nbytes && op->data.dir == SPI_MEM_DATA_IN)
-+		fsl_qspi_read_rxfifo(q, op);
-+
-+	return err;
-+}
-+
-+static int fsl_qspi_readl_poll_tout(struct fsl_qspi *q, void __iomem *base,
-+				    u32 mask, u32 delay_us, u32 timeout_us)
-+{
-+	u32 reg;
-+
-+	if (!q->devtype_data->little_endian)
-+		mask = (u32)cpu_to_be32(mask);
-+
-+	return readl_poll_timeout(base, reg, !(reg & mask), delay_us,
-+				  timeout_us);
-+}
-+
-+static int fsl_qspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
-+{
-+	struct fsl_qspi *q = spi_controller_get_devdata(mem->spi->master);
-+	void __iomem *base = q->iobase;
-+	u32 addr_offset = 0;
-+	int err = 0;
-+
-+	mutex_lock(&q->lock);
-+
-+	/* wait for the controller being ready */
-+	fsl_qspi_readl_poll_tout(q, base + QUADSPI_SR, (QUADSPI_SR_IP_ACC_MASK |
-+				 QUADSPI_SR_AHB_ACC_MASK), 10, 1000);
-+
-+	fsl_qspi_select_mem(q, mem->spi);
-+
-+	if (needs_amba_base_offset(q))
-+		addr_offset = q->memmap_phy;
-+
-+	qspi_writel(q,
-+		    q->selected * q->devtype_data->ahb_buf_size + addr_offset,
-+		    base + QUADSPI_SFAR);
-+
-+	qspi_writel(q, qspi_readl(q, base + QUADSPI_MCR) |
-+		    QUADSPI_MCR_CLR_RXF_MASK | QUADSPI_MCR_CLR_TXF_MASK,
-+		    base + QUADSPI_MCR);
-+
-+	qspi_writel(q, QUADSPI_SPTRCLR_BFPTRC | QUADSPI_SPTRCLR_IPPTRC,
-+		    base + QUADSPI_SPTRCLR);
-+
-+	fsl_qspi_prepare_lut(q, op);
-+
-+	/*
-+	 * If we have large chunks of data, we read them through the AHB bus
-+	 * by accessing the mapped memory. In all other cases we use
-+	 * IP commands to access the flash.
-+	 */
-+	if (op->data.nbytes > (q->devtype_data->rxfifo - 4) &&
-+	    op->data.dir == SPI_MEM_DATA_IN) {
-+		fsl_qspi_read_ahb(q, op);
-+	} else {
-+		qspi_writel(q, QUADSPI_RBCT_WMRK_MASK |
-+			    QUADSPI_RBCT_RXBRD_USEIPS, base + QUADSPI_RBCT);
-+
-+		if (op->data.nbytes && op->data.dir == SPI_MEM_DATA_OUT)
-+			fsl_qspi_fill_txfifo(q, op);
-+
-+		err = fsl_qspi_do_op(q, op);
-+	}
-+
-+	/* Invalidate the data in the AHB buffer. */
-+	fsl_qspi_invalidate(q);
-+
-+	mutex_unlock(&q->lock);
-+
-+	return err;
-+}
-+
-+static int fsl_qspi_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
-+{
-+	struct fsl_qspi *q = spi_controller_get_devdata(mem->spi->master);
-+
-+	if (op->data.dir == SPI_MEM_DATA_OUT) {
-+		if (op->data.nbytes > q->devtype_data->txfifo)
-+			op->data.nbytes = q->devtype_data->txfifo;
-+	} else {
-+		if (op->data.nbytes > q->devtype_data->ahb_buf_size)
-+			op->data.nbytes = q->devtype_data->ahb_buf_size;
-+		else if (op->data.nbytes > (q->devtype_data->rxfifo - 4))
-+			op->data.nbytes = ALIGN_DOWN(op->data.nbytes, 8);
-+	}
-+
-+	return 0;
-+}
-+
-+static int fsl_qspi_default_setup(struct fsl_qspi *q)
-+{
-+	void __iomem *base = q->iobase;
-+	u32 reg, addr_offset = 0;
-+	int ret;
-+
-+	/* disable and unprepare clock to avoid glitch pass to controller */
-+	fsl_qspi_clk_disable_unprep(q);
-+
-+	/* the default frequency, we will change it later if necessary. */
-+	ret = clk_set_rate(q->clk, 66000000);
-+	if (ret)
-+		return ret;
-+
-+	ret = fsl_qspi_clk_prep_enable(q);
-+	if (ret)
-+		return ret;
-+
-+	/* Reset the module */
-+	qspi_writel(q, QUADSPI_MCR_SWRSTSD_MASK | QUADSPI_MCR_SWRSTHD_MASK,
-+		    base + QUADSPI_MCR);
-+	udelay(1);
-+
-+	/* Disable the module */
-+	qspi_writel(q, QUADSPI_MCR_MDIS_MASK | QUADSPI_MCR_RESERVED_MASK,
-+		    base + QUADSPI_MCR);
-+
-+	reg = qspi_readl(q, base + QUADSPI_SMPR);
-+	qspi_writel(q, reg & ~(QUADSPI_SMPR_FSDLY_MASK
-+			| QUADSPI_SMPR_FSPHS_MASK
-+			| QUADSPI_SMPR_HSENA_MASK
-+			| QUADSPI_SMPR_DDRSMP_MASK), base + QUADSPI_SMPR);
-+
-+	/* We only use the buffer3 for AHB read */
-+	qspi_writel(q, 0, base + QUADSPI_BUF0IND);
-+	qspi_writel(q, 0, base + QUADSPI_BUF1IND);
-+	qspi_writel(q, 0, base + QUADSPI_BUF2IND);
-+
-+	qspi_writel(q, QUADSPI_BFGENCR_SEQID(SEQID_LUT),
-+		    q->iobase + QUADSPI_BFGENCR);
-+	qspi_writel(q, QUADSPI_RBCT_WMRK_MASK, base + QUADSPI_RBCT);
-+	qspi_writel(q, QUADSPI_BUF3CR_ALLMST_MASK |
-+		    QUADSPI_BUF3CR_ADATSZ(q->devtype_data->ahb_buf_size / 8),
-+		    base + QUADSPI_BUF3CR);
-+
-+	if (needs_amba_base_offset(q))
-+		addr_offset = q->memmap_phy;
-+
-+	/*
-+	 * In HW there can be a maximum of four chips on two buses with
-+	 * two chip selects on each bus. We use four chip selects in SW
-+	 * to differentiate between the four chips.
-+	 * We use ahb_buf_size for each chip and set SFA1AD, SFA2AD, SFB1AD,
-+	 * SFB2AD accordingly.
-+	 */
-+	qspi_writel(q, q->devtype_data->ahb_buf_size + addr_offset,
-+		    base + QUADSPI_SFA1AD);
-+	qspi_writel(q, q->devtype_data->ahb_buf_size * 2 + addr_offset,
-+		    base + QUADSPI_SFA2AD);
-+	qspi_writel(q, q->devtype_data->ahb_buf_size * 3 + addr_offset,
-+		    base + QUADSPI_SFB1AD);
-+	qspi_writel(q, q->devtype_data->ahb_buf_size * 4 + addr_offset,
-+		    base + QUADSPI_SFB2AD);
-+
-+	q->selected = -1;
-+
-+	/* Enable the module */
-+	qspi_writel(q, QUADSPI_MCR_RESERVED_MASK | QUADSPI_MCR_END_CFG_MASK,
-+		    base + QUADSPI_MCR);
-+
-+	/* clear all interrupt status */
-+	qspi_writel(q, 0xffffffff, q->iobase + QUADSPI_FR);
-+
-+	/* enable the interrupt */
-+	qspi_writel(q, QUADSPI_RSER_TFIE, q->iobase + QUADSPI_RSER);
-+
-+	return 0;
-+}
-+
-+static const char *fsl_qspi_get_name(struct spi_mem *mem)
-+{
-+	struct fsl_qspi *q = spi_controller_get_devdata(mem->spi->master);
-+	struct device *dev = &mem->spi->dev;
-+	const char *name;
-+
-+	/*
-+	 * In order to keep mtdparts compatible with the old MTD driver at
-+	 * mtd/spi-nor/fsl-quadspi.c, we set a custom name derived from the
-+	 * platform_device of the controller.
-+	 */
-+	if (of_get_available_child_count(q->dev->of_node) == 1)
-+		return dev_name(q->dev);
-+
-+	name = devm_kasprintf(dev, GFP_KERNEL,
-+			      "%s-%d", dev_name(q->dev),
-+			      mem->spi->chip_select);
-+
-+	if (!name) {
-+		dev_err(dev, "failed to get memory for custom flash name\n");
-+		return ERR_PTR(-ENOMEM);
-+	}
-+
-+	return name;
-+}
-+
-+static const struct spi_controller_mem_ops fsl_qspi_mem_ops = {
-+	.adjust_op_size = fsl_qspi_adjust_op_size,
-+	.supports_op = fsl_qspi_supports_op,
-+	.exec_op = fsl_qspi_exec_op,
-+	.get_name = fsl_qspi_get_name,
-+};
-+
-+static int fsl_qspi_probe(struct platform_device *pdev)
-+{
-+	struct spi_controller *ctlr;
-+	struct device *dev = &pdev->dev;
-+	struct device_node *np = dev->of_node;
-+	struct resource *res;
-+	struct fsl_qspi *q;
-+	int ret;
-+
-+	ctlr = spi_alloc_master(&pdev->dev, sizeof(*q));
-+	if (!ctlr)
-+		return -ENOMEM;
-+
-+	ctlr->mode_bits = SPI_RX_DUAL | SPI_RX_QUAD |
-+			  SPI_TX_DUAL | SPI_TX_QUAD;
-+
-+	q = spi_controller_get_devdata(ctlr);
-+	q->dev = dev;
-+	q->devtype_data = of_device_get_match_data(dev);
-+	if (!q->devtype_data) {
-+		ret = -ENODEV;
-+		goto err_put_ctrl;
-+	}
-+
-+	platform_set_drvdata(pdev, q);
-+
-+	/* find the resources */
-+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "QuadSPI");
-+	q->iobase = devm_ioremap_resource(dev, res);
-+	if (IS_ERR(q->iobase)) {
-+		ret = PTR_ERR(q->iobase);
-+		goto err_put_ctrl;
-+	}
-+
-+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
-+					"QuadSPI-memory");
-+	q->ahb_addr = devm_ioremap_resource(dev, res);
-+	if (IS_ERR(q->ahb_addr)) {
-+		ret = PTR_ERR(q->ahb_addr);
-+		goto err_put_ctrl;
-+	}
-+
-+	q->memmap_phy = res->start;
-+
-+	/* find the clocks */
-+	q->clk_en = devm_clk_get(dev, "qspi_en");
-+	if (IS_ERR(q->clk_en)) {
-+		ret = PTR_ERR(q->clk_en);
-+		goto err_put_ctrl;
-+	}
-+
-+	q->clk = devm_clk_get(dev, "qspi");
-+	if (IS_ERR(q->clk)) {
-+		ret = PTR_ERR(q->clk);
-+		goto err_put_ctrl;
-+	}
-+
-+	ret = fsl_qspi_clk_prep_enable(q);
-+	if (ret) {
-+		dev_err(dev, "can not enable the clock\n");
-+		goto err_put_ctrl;
-+	}
-+
-+	/* find the irq */
-+	ret = platform_get_irq(pdev, 0);
-+	if (ret < 0) {
-+		dev_err(dev, "failed to get the irq: %d\n", ret);
-+		goto err_disable_clk;
-+	}
-+
-+	ret = devm_request_irq(dev, ret,
-+			fsl_qspi_irq_handler, 0, pdev->name, q);
-+	if (ret) {
-+		dev_err(dev, "failed to request irq: %d\n", ret);
-+		goto err_disable_clk;
-+	}
-+
-+	mutex_init(&q->lock);
-+
-+	ctlr->bus_num = -1;
-+	ctlr->num_chipselect = 4;
-+	ctlr->mem_ops = &fsl_qspi_mem_ops;
-+
-+	fsl_qspi_default_setup(q);
-+
-+	ctlr->dev.of_node = np;
-+
-+	ret = spi_register_controller(ctlr);
-+	if (ret)
-+		goto err_destroy_mutex;
-+
-+	return 0;
-+
-+err_destroy_mutex:
-+	mutex_destroy(&q->lock);
-+
-+err_disable_clk:
-+	fsl_qspi_clk_disable_unprep(q);
-+
-+err_put_ctrl:
-+	spi_controller_put(ctlr);
-+
-+	dev_err(dev, "Freescale QuadSPI probe failed\n");
-+	return ret;
-+}
-+
-+static int fsl_qspi_remove(struct platform_device *pdev)
-+{
-+	struct fsl_qspi *q = platform_get_drvdata(pdev);
-+
-+	/* disable the hardware */
-+	qspi_writel(q, QUADSPI_MCR_MDIS_MASK, q->iobase + QUADSPI_MCR);
-+	qspi_writel(q, 0x0, q->iobase + QUADSPI_RSER);
-+
-+	fsl_qspi_clk_disable_unprep(q);
-+
-+	mutex_destroy(&q->lock);
-+
-+	return 0;
-+}
-+
-+static int fsl_qspi_suspend(struct device *dev)
-+{
-+	return 0;
-+}
-+
-+static int fsl_qspi_resume(struct device *dev)
-+{
-+	struct fsl_qspi *q = dev_get_drvdata(dev);
-+
-+	fsl_qspi_default_setup(q);
-+
-+	return 0;
-+}
-+
-+static const struct of_device_id fsl_qspi_dt_ids[] = {
-+	{ .compatible = "fsl,vf610-qspi", .data = &vybrid_data, },
-+	{ .compatible = "fsl,imx6sx-qspi", .data = &imx6sx_data, },
-+	{ .compatible = "fsl,imx7d-qspi", .data = &imx7d_data, },
-+	{ .compatible = "fsl,imx6ul-qspi", .data = &imx6ul_data, },
-+	{ .compatible = "fsl,ls1021a-qspi", .data = &ls1021a_data, },
-+	{ .compatible = "fsl,ls2080a-qspi", .data = &ls2080a_data, },
-+	{ /* sentinel */ }
-+};
-+MODULE_DEVICE_TABLE(of, fsl_qspi_dt_ids);
-+
-+static const struct dev_pm_ops fsl_qspi_pm_ops = {
-+	.suspend	= fsl_qspi_suspend,
-+	.resume		= fsl_qspi_resume,
-+};
-+
-+static struct platform_driver fsl_qspi_driver = {
-+	.driver = {
-+		.name	= "fsl-quadspi",
-+		.of_match_table = fsl_qspi_dt_ids,
-+		.pm =   &fsl_qspi_pm_ops,
-+	},
-+	.probe          = fsl_qspi_probe,
-+	.remove		= fsl_qspi_remove,
-+};
-+module_platform_driver(fsl_qspi_driver);
-+
-+MODULE_DESCRIPTION("Freescale QuadSPI Controller Driver");
-+MODULE_AUTHOR("Freescale Semiconductor Inc.");
-+MODULE_AUTHOR("Boris Brezillon <bbrezillon@kernel.org>");
-+MODULE_AUTHOR("Frieder Schrempf <frieder.schrempf@kontron.de>");
-+MODULE_AUTHOR("Yogesh Gaur <yogeshnarayan.gaur@nxp.com>");
-+MODULE_AUTHOR("Suresh Gupta <suresh.gupta@nxp.com>");
-+MODULE_LICENSE("GPL v2");
-diff --git a/drivers/spi/spi-geni-qcom.c b/drivers/spi/spi-geni-qcom.c
-index fdb7cb88fb56..5f0b0d5bfef4 100644
---- a/drivers/spi/spi-geni-qcom.c
-+++ b/drivers/spi/spi-geni-qcom.c
-@@ -89,9 +89,6 @@ struct spi_geni_master {
- 	int irq;
- };
- 
--static void handle_fifo_timeout(struct spi_master *spi,
--				struct spi_message *msg);
--
- static int get_spi_clk_cfg(unsigned int speed_hz,
- 			struct spi_geni_master *mas,
- 			unsigned int *clk_idx,
-@@ -122,6 +119,32 @@ static int get_spi_clk_cfg(unsigned int speed_hz,
- 	return ret;
- }
- 
-+static void handle_fifo_timeout(struct spi_master *spi,
-+				struct spi_message *msg)
-+{
-+	struct spi_geni_master *mas = spi_master_get_devdata(spi);
-+	unsigned long time_left, flags;
-+	struct geni_se *se = &mas->se;
-+
-+	spin_lock_irqsave(&mas->lock, flags);
-+	reinit_completion(&mas->xfer_done);
-+	mas->cur_mcmd = CMD_CANCEL;
-+	geni_se_cancel_m_cmd(se);
-+	writel(0, se->base + SE_GENI_TX_WATERMARK_REG);
-+	spin_unlock_irqrestore(&mas->lock, flags);
-+	time_left = wait_for_completion_timeout(&mas->xfer_done, HZ);
-+	if (time_left)
-+		return;
-+
-+	spin_lock_irqsave(&mas->lock, flags);
-+	reinit_completion(&mas->xfer_done);
-+	geni_se_abort_m_cmd(se);
-+	spin_unlock_irqrestore(&mas->lock, flags);
-+	time_left = wait_for_completion_timeout(&mas->xfer_done, HZ);
-+	if (!time_left)
-+		dev_err(mas->dev, "Failed to cancel/abort m_cmd\n");
-+}
-+
- static void spi_geni_set_cs(struct spi_device *slv, bool set_flag)
- {
- 	struct spi_geni_master *mas = spi_master_get_devdata(slv->master);
-@@ -233,7 +256,6 @@ static int spi_geni_prepare_message(struct spi_master *spi,
- 	struct geni_se *se = &mas->se;
- 
- 	geni_se_select_mode(se, GENI_SE_FIFO);
--	reinit_completion(&mas->xfer_done);
- 	ret = setup_fifo_params(spi_msg->spi, spi);
- 	if (ret)
- 		dev_err(mas->dev, "Couldn't select mode %d\n", ret);
-@@ -357,32 +379,6 @@ static void setup_fifo_xfer(struct spi_transfer *xfer,
- 		writel(mas->tx_wm, se->base + SE_GENI_TX_WATERMARK_REG);
- }
- 
--static void handle_fifo_timeout(struct spi_master *spi,
--				struct spi_message *msg)
--{
--	struct spi_geni_master *mas = spi_master_get_devdata(spi);
--	unsigned long time_left, flags;
--	struct geni_se *se = &mas->se;
--
--	spin_lock_irqsave(&mas->lock, flags);
--	reinit_completion(&mas->xfer_done);
--	mas->cur_mcmd = CMD_CANCEL;
--	geni_se_cancel_m_cmd(se);
--	writel(0, se->base + SE_GENI_TX_WATERMARK_REG);
--	spin_unlock_irqrestore(&mas->lock, flags);
--	time_left = wait_for_completion_timeout(&mas->xfer_done, HZ);
--	if (time_left)
--		return;
--
--	spin_lock_irqsave(&mas->lock, flags);
--	reinit_completion(&mas->xfer_done);
--	geni_se_abort_m_cmd(se);
--	spin_unlock_irqrestore(&mas->lock, flags);
--	time_left = wait_for_completion_timeout(&mas->xfer_done, HZ);
--	if (!time_left)
--		dev_err(mas->dev, "Failed to cancel/abort m_cmd\n");
--}
--
- static int spi_geni_transfer_one(struct spi_master *spi,
- 				struct spi_device *slv,
- 				struct spi_transfer *xfer)
-diff --git a/drivers/spi/spi-gpio.c b/drivers/spi/spi-gpio.c
-index a4aee26028cd..3e98c1a0ba6d 100644
---- a/drivers/spi/spi-gpio.c
-+++ b/drivers/spi/spi-gpio.c
-@@ -428,7 +428,8 @@ static int spi_gpio_probe(struct platform_device *pdev)
- 		return status;
- 
- 	master->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 32);
--	master->mode_bits = SPI_3WIRE | SPI_3WIRE_HIZ | SPI_CPHA | SPI_CPOL;
-+	master->mode_bits = SPI_3WIRE | SPI_3WIRE_HIZ | SPI_CPHA | SPI_CPOL |
-+			    SPI_CS_HIGH;
- 	master->flags = master_flags;
- 	master->bus_num = pdev->id;
- 	/* The master needs to think there is a chipselect even if not connected */
-diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c
-index 5217a5628be2..a4d8d19ecff9 100644
---- a/drivers/spi/spi-mem.c
-+++ b/drivers/spi/spi-mem.c
-@@ -537,7 +537,6 @@ EXPORT_SYMBOL_GPL(spi_mem_dirmap_create);
- /**
-  * spi_mem_dirmap_destroy() - Destroy a direct mapping descriptor
-  * @desc: the direct mapping descriptor to destroy
-- * @info: direct mapping information
-  *
-  * This function destroys a direct mapping descriptor previously created by
-  * spi_mem_dirmap_create().
-@@ -548,9 +547,80 @@ void spi_mem_dirmap_destroy(struct spi_mem_dirmap_desc *desc)
- 
- 	if (!desc->nodirmap && ctlr->mem_ops && ctlr->mem_ops->dirmap_destroy)
- 		ctlr->mem_ops->dirmap_destroy(desc);
-+
-+	kfree(desc);
- }
- EXPORT_SYMBOL_GPL(spi_mem_dirmap_destroy);
- 
-+static void devm_spi_mem_dirmap_release(struct device *dev, void *res)
-+{
-+	struct spi_mem_dirmap_desc *desc = *(struct spi_mem_dirmap_desc **)res;
-+
-+	spi_mem_dirmap_destroy(desc);
-+}
-+
-+/**
-+ * devm_spi_mem_dirmap_create() - Create a direct mapping descriptor and attach
-+ *				  it to a device
-+ * @dev: device the dirmap desc will be attached to
-+ * @mem: SPI mem device this direct mapping should be created for
-+ * @info: direct mapping information
-+ *
-+ * devm_ variant of the spi_mem_dirmap_create() function. See
-+ * spi_mem_dirmap_create() for more details.
-+ *
-+ * Return: a valid pointer in case of success, and ERR_PTR() otherwise.
-+ */
-+struct spi_mem_dirmap_desc *
-+devm_spi_mem_dirmap_create(struct device *dev, struct spi_mem *mem,
-+			   const struct spi_mem_dirmap_info *info)
-+{
-+	struct spi_mem_dirmap_desc **ptr, *desc;
-+
-+	ptr = devres_alloc(devm_spi_mem_dirmap_release, sizeof(*ptr),
-+			   GFP_KERNEL);
-+	if (!ptr)
-+		return ERR_PTR(-ENOMEM);
-+
-+	desc = spi_mem_dirmap_create(mem, info);
-+	if (IS_ERR(desc)) {
-+		devres_free(ptr);
-+	} else {
-+		*ptr = desc;
-+		devres_add(dev, ptr);
-+	}
-+
-+	return desc;
-+}
-+EXPORT_SYMBOL_GPL(devm_spi_mem_dirmap_create);
-+
-+static int devm_spi_mem_dirmap_match(struct device *dev, void *res, void *data)
-+{
-+        struct spi_mem_dirmap_desc **ptr = res;
-+
-+        if (WARN_ON(!ptr || !*ptr))
-+                return 0;
-+
-+	return *ptr == data;
-+}
-+
-+/**
-+ * devm_spi_mem_dirmap_destroy() - Destroy a direct mapping descriptor attached
-+ *				   to a device
-+ * @dev: device the dirmap desc is attached to
-+ * @desc: the direct mapping descriptor to destroy
-+ *
-+ * devm_ variant of the spi_mem_dirmap_destroy() function. See
-+ * spi_mem_dirmap_destroy() for more details.
-+ */
-+void devm_spi_mem_dirmap_destroy(struct device *dev,
-+				 struct spi_mem_dirmap_desc *desc)
-+{
-+	devres_release(dev, devm_spi_mem_dirmap_release,
-+		       devm_spi_mem_dirmap_match, desc);
-+}
-+EXPORT_SYMBOL_GPL(devm_spi_mem_dirmap_destroy);
-+
- /**
-  * spi_mem_dirmap_dirmap_read() - Read data through a direct mapping
-  * @desc: direct mapping descriptor
-diff --git a/drivers/spi/spi-mxs.c b/drivers/spi/spi-mxs.c
-index 6ac95a2a21ce..7bf53cfc25d6 100644
---- a/drivers/spi/spi-mxs.c
-+++ b/drivers/spi/spi-mxs.c
-@@ -39,6 +39,7 @@
- #include <linux/stmp_device.h>
- #include <linux/spi/spi.h>
- #include <linux/spi/mxs-spi.h>
-+#include <trace/events/spi.h>
- 
- #define DRIVER_NAME		"mxs-spi"
- 
-@@ -374,6 +375,8 @@ static int mxs_spi_transfer_one(struct spi_master *master,
- 
- 	list_for_each_entry(t, &m->transfers, transfer_list) {
- 
-+		trace_spi_transfer_start(m, t);
-+
- 		status = mxs_spi_setup_transfer(m->spi, t);
- 		if (status)
- 			break;
-@@ -419,6 +422,8 @@ static int mxs_spi_transfer_one(struct spi_master *master,
- 						flag);
- 		}
- 
-+		trace_spi_transfer_stop(m, t);
-+
- 		if (status) {
- 			stmp_reset_block(ssp->base);
- 			break;
-diff --git a/drivers/spi/spi-npcm-pspi.c b/drivers/spi/spi-npcm-pspi.c
-index e1dca79b9090..734a2b956959 100644
---- a/drivers/spi/spi-npcm-pspi.c
-+++ b/drivers/spi/spi-npcm-pspi.c
-@@ -465,7 +465,8 @@ static int npcm_pspi_probe(struct platform_device *pdev)
- 
- static int npcm_pspi_remove(struct platform_device *pdev)
- {
--	struct npcm_pspi *priv = platform_get_drvdata(pdev);
-+	struct spi_master *master = platform_get_drvdata(pdev);
-+	struct npcm_pspi *priv = spi_master_get_devdata(master);
- 
- 	npcm_pspi_reset_hw(priv);
- 	clk_disable_unprepare(priv->clk);
-diff --git a/drivers/spi/spi-nxp-fspi.c b/drivers/spi/spi-nxp-fspi.c
-new file mode 100644
-index 000000000000..8894f98cc99c
---- /dev/null
-+++ b/drivers/spi/spi-nxp-fspi.c
-@@ -0,0 +1,1106 @@
-+// SPDX-License-Identifier: GPL-2.0+
-+
-+/*
-+ * NXP FlexSPI(FSPI) controller driver.
-+ *
-+ * Copyright 2019 NXP.
-+ *
-+ * FlexSPI is a flexsible SPI host controller which supports two SPI
-+ * channels and up to 4 external devices. Each channel supports
-+ * Single/Dual/Quad/Octal mode data transfer (1/2/4/8 bidirectional
-+ * data lines).
-+ *
-+ * FlexSPI controller is driven by the LUT(Look-up Table) registers
-+ * LUT registers are a look-up-table for sequences of instructions.
-+ * A valid sequence consists of four LUT registers.
-+ * Maximum 32 LUT sequences can be programmed simultaneously.
-+ *
-+ * LUTs are being created at run-time based on the commands passed
-+ * from the spi-mem framework, thus using single LUT index.
-+ *
-+ * Software triggered Flash read/write access by IP Bus.
-+ *
-+ * Memory mapped read access by AHB Bus.
-+ *
-+ * Based on SPI MEM interface and spi-fsl-qspi.c driver.
-+ *
-+ * Author:
-+ *     Yogesh Narayan Gaur <yogeshnarayan.gaur@nxp.com>
-+ *     Boris Brezillon <bbrezillon@kernel.org>
-+ *     Frieder Schrempf <frieder.schrempf@kontron.de>
-+ */
-+
-+#include <linux/bitops.h>
-+#include <linux/clk.h>
-+#include <linux/completion.h>
-+#include <linux/delay.h>
-+#include <linux/err.h>
-+#include <linux/errno.h>
-+#include <linux/interrupt.h>
-+#include <linux/io.h>
-+#include <linux/iopoll.h>
-+#include <linux/jiffies.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/mutex.h>
-+#include <linux/of.h>
-+#include <linux/of_device.h>
-+#include <linux/platform_device.h>
-+#include <linux/pm_qos.h>
-+#include <linux/sizes.h>
-+
-+#include <linux/spi/spi.h>
-+#include <linux/spi/spi-mem.h>
-+
-+/*
-+ * The driver only uses one single LUT entry, that is updated on
-+ * each call of exec_op(). Index 0 is preset at boot with a basic
-+ * read operation, so let's use the last entry (31).
-+ */
-+#define	SEQID_LUT			31
-+
-+/* Registers used by the driver */
-+#define FSPI_MCR0			0x00
-+#define FSPI_MCR0_AHB_TIMEOUT(x)	((x) << 24)
-+#define FSPI_MCR0_IP_TIMEOUT(x)		((x) << 16)
-+#define FSPI_MCR0_LEARN_EN		BIT(15)
-+#define FSPI_MCR0_SCRFRUN_EN		BIT(14)
-+#define FSPI_MCR0_OCTCOMB_EN		BIT(13)
-+#define FSPI_MCR0_DOZE_EN		BIT(12)
-+#define FSPI_MCR0_HSEN			BIT(11)
-+#define FSPI_MCR0_SERCLKDIV		BIT(8)
-+#define FSPI_MCR0_ATDF_EN		BIT(7)
-+#define FSPI_MCR0_ARDF_EN		BIT(6)
-+#define FSPI_MCR0_RXCLKSRC(x)		((x) << 4)
-+#define FSPI_MCR0_END_CFG(x)		((x) << 2)
-+#define FSPI_MCR0_MDIS			BIT(1)
-+#define FSPI_MCR0_SWRST			BIT(0)
-+
-+#define FSPI_MCR1			0x04
-+#define FSPI_MCR1_SEQ_TIMEOUT(x)	((x) << 16)
-+#define FSPI_MCR1_AHB_TIMEOUT(x)	(x)
-+
-+#define FSPI_MCR2			0x08
-+#define FSPI_MCR2_IDLE_WAIT(x)		((x) << 24)
-+#define FSPI_MCR2_SAMEDEVICEEN		BIT(15)
-+#define FSPI_MCR2_CLRLRPHS		BIT(14)
-+#define FSPI_MCR2_ABRDATSZ		BIT(8)
-+#define FSPI_MCR2_ABRLEARN		BIT(7)
-+#define FSPI_MCR2_ABR_READ		BIT(6)
-+#define FSPI_MCR2_ABRWRITE		BIT(5)
-+#define FSPI_MCR2_ABRDUMMY		BIT(4)
-+#define FSPI_MCR2_ABR_MODE		BIT(3)
-+#define FSPI_MCR2_ABRCADDR		BIT(2)
-+#define FSPI_MCR2_ABRRADDR		BIT(1)
-+#define FSPI_MCR2_ABR_CMD		BIT(0)
-+
-+#define FSPI_AHBCR			0x0c
-+#define FSPI_AHBCR_RDADDROPT		BIT(6)
-+#define FSPI_AHBCR_PREF_EN		BIT(5)
-+#define FSPI_AHBCR_BUFF_EN		BIT(4)
-+#define FSPI_AHBCR_CACH_EN		BIT(3)
-+#define FSPI_AHBCR_CLRTXBUF		BIT(2)
-+#define FSPI_AHBCR_CLRRXBUF		BIT(1)
-+#define FSPI_AHBCR_PAR_EN		BIT(0)
-+
-+#define FSPI_INTEN			0x10
-+#define FSPI_INTEN_SCLKSBWR		BIT(9)
-+#define FSPI_INTEN_SCLKSBRD		BIT(8)
-+#define FSPI_INTEN_DATALRNFL		BIT(7)
-+#define FSPI_INTEN_IPTXWE		BIT(6)
-+#define FSPI_INTEN_IPRXWA		BIT(5)
-+#define FSPI_INTEN_AHBCMDERR		BIT(4)
-+#define FSPI_INTEN_IPCMDERR		BIT(3)
-+#define FSPI_INTEN_AHBCMDGE		BIT(2)
-+#define FSPI_INTEN_IPCMDGE		BIT(1)
-+#define FSPI_INTEN_IPCMDDONE		BIT(0)
-+
-+#define FSPI_INTR			0x14
-+#define FSPI_INTR_SCLKSBWR		BIT(9)
-+#define FSPI_INTR_SCLKSBRD		BIT(8)
-+#define FSPI_INTR_DATALRNFL		BIT(7)
-+#define FSPI_INTR_IPTXWE		BIT(6)
-+#define FSPI_INTR_IPRXWA		BIT(5)
-+#define FSPI_INTR_AHBCMDERR		BIT(4)
-+#define FSPI_INTR_IPCMDERR		BIT(3)
-+#define FSPI_INTR_AHBCMDGE		BIT(2)
-+#define FSPI_INTR_IPCMDGE		BIT(1)
-+#define FSPI_INTR_IPCMDDONE		BIT(0)
-+
-+#define FSPI_LUTKEY			0x18
-+#define FSPI_LUTKEY_VALUE		0x5AF05AF0
-+
-+#define FSPI_LCKCR			0x1C
-+
-+#define FSPI_LCKER_LOCK			0x1
-+#define FSPI_LCKER_UNLOCK		0x2
-+
-+#define FSPI_BUFXCR_INVALID_MSTRID	0xE
-+#define FSPI_AHBRX_BUF0CR0		0x20
-+#define FSPI_AHBRX_BUF1CR0		0x24
-+#define FSPI_AHBRX_BUF2CR0		0x28
-+#define FSPI_AHBRX_BUF3CR0		0x2C
-+#define FSPI_AHBRX_BUF4CR0		0x30
-+#define FSPI_AHBRX_BUF5CR0		0x34
-+#define FSPI_AHBRX_BUF6CR0		0x38
-+#define FSPI_AHBRX_BUF7CR0		0x3C
-+#define FSPI_AHBRXBUF0CR7_PREF		BIT(31)
-+
-+#define FSPI_AHBRX_BUF0CR1		0x40
-+#define FSPI_AHBRX_BUF1CR1		0x44
-+#define FSPI_AHBRX_BUF2CR1		0x48
-+#define FSPI_AHBRX_BUF3CR1		0x4C
-+#define FSPI_AHBRX_BUF4CR1		0x50
-+#define FSPI_AHBRX_BUF5CR1		0x54
-+#define FSPI_AHBRX_BUF6CR1		0x58
-+#define FSPI_AHBRX_BUF7CR1		0x5C
-+
-+#define FSPI_FLSHA1CR0			0x60
-+#define FSPI_FLSHA2CR0			0x64
-+#define FSPI_FLSHB1CR0			0x68
-+#define FSPI_FLSHB2CR0			0x6C
-+#define FSPI_FLSHXCR0_SZ_KB		10
-+#define FSPI_FLSHXCR0_SZ(x)		((x) >> FSPI_FLSHXCR0_SZ_KB)
-+
-+#define FSPI_FLSHA1CR1			0x70
-+#define FSPI_FLSHA2CR1			0x74
-+#define FSPI_FLSHB1CR1			0x78
-+#define FSPI_FLSHB2CR1			0x7C
-+#define FSPI_FLSHXCR1_CSINTR(x)		((x) << 16)
-+#define FSPI_FLSHXCR1_CAS(x)		((x) << 11)
-+#define FSPI_FLSHXCR1_WA		BIT(10)
-+#define FSPI_FLSHXCR1_TCSH(x)		((x) << 5)
-+#define FSPI_FLSHXCR1_TCSS(x)		(x)
-+
-+#define FSPI_FLSHA1CR2			0x80
-+#define FSPI_FLSHA2CR2			0x84
-+#define FSPI_FLSHB1CR2			0x88
-+#define FSPI_FLSHB2CR2			0x8C
-+#define FSPI_FLSHXCR2_CLRINSP		BIT(24)
-+#define FSPI_FLSHXCR2_AWRWAIT		BIT(16)
-+#define FSPI_FLSHXCR2_AWRSEQN_SHIFT	13
-+#define FSPI_FLSHXCR2_AWRSEQI_SHIFT	8
-+#define FSPI_FLSHXCR2_ARDSEQN_SHIFT	5
-+#define FSPI_FLSHXCR2_ARDSEQI_SHIFT	0
-+
-+#define FSPI_IPCR0			0xA0
-+
-+#define FSPI_IPCR1			0xA4
-+#define FSPI_IPCR1_IPAREN		BIT(31)
-+#define FSPI_IPCR1_SEQNUM_SHIFT		24
-+#define FSPI_IPCR1_SEQID_SHIFT		16
-+#define FSPI_IPCR1_IDATSZ(x)		(x)
-+
-+#define FSPI_IPCMD			0xB0
-+#define FSPI_IPCMD_TRG			BIT(0)
-+
-+#define FSPI_DLPR			0xB4
-+
-+#define FSPI_IPRXFCR			0xB8
-+#define FSPI_IPRXFCR_CLR		BIT(0)
-+#define FSPI_IPRXFCR_DMA_EN		BIT(1)
-+#define FSPI_IPRXFCR_WMRK(x)		((x) << 2)
-+
-+#define FSPI_IPTXFCR			0xBC
-+#define FSPI_IPTXFCR_CLR		BIT(0)
-+#define FSPI_IPTXFCR_DMA_EN		BIT(1)
-+#define FSPI_IPTXFCR_WMRK(x)		((x) << 2)
-+
-+#define FSPI_DLLACR			0xC0
-+#define FSPI_DLLACR_OVRDEN		BIT(8)
-+
-+#define FSPI_DLLBCR			0xC4
-+#define FSPI_DLLBCR_OVRDEN		BIT(8)
-+
-+#define FSPI_STS0			0xE0
-+#define FSPI_STS0_DLPHB(x)		((x) << 8)
-+#define FSPI_STS0_DLPHA(x)		((x) << 4)
-+#define FSPI_STS0_CMD_SRC(x)		((x) << 2)
-+#define FSPI_STS0_ARB_IDLE		BIT(1)
-+#define FSPI_STS0_SEQ_IDLE		BIT(0)
-+
-+#define FSPI_STS1			0xE4
-+#define FSPI_STS1_IP_ERRCD(x)		((x) << 24)
-+#define FSPI_STS1_IP_ERRID(x)		((x) << 16)
-+#define FSPI_STS1_AHB_ERRCD(x)		((x) << 8)
-+#define FSPI_STS1_AHB_ERRID(x)		(x)
-+
-+#define FSPI_AHBSPNST			0xEC
-+#define FSPI_AHBSPNST_DATLFT(x)		((x) << 16)
-+#define FSPI_AHBSPNST_BUFID(x)		((x) << 1)
-+#define FSPI_AHBSPNST_ACTIVE		BIT(0)
-+
-+#define FSPI_IPRXFSTS			0xF0
-+#define FSPI_IPRXFSTS_RDCNTR(x)		((x) << 16)
-+#define FSPI_IPRXFSTS_FILL(x)		(x)
-+
-+#define FSPI_IPTXFSTS			0xF4
-+#define FSPI_IPTXFSTS_WRCNTR(x)		((x) << 16)
-+#define FSPI_IPTXFSTS_FILL(x)		(x)
-+
-+#define FSPI_RFDR			0x100
-+#define FSPI_TFDR			0x180
-+
-+#define FSPI_LUT_BASE			0x200
-+#define FSPI_LUT_OFFSET			(SEQID_LUT * 4 * 4)
-+#define FSPI_LUT_REG(idx) \
-+	(FSPI_LUT_BASE + FSPI_LUT_OFFSET + (idx) * 4)
-+
-+/* register map end */
-+
-+/* Instruction set for the LUT register. */
-+#define LUT_STOP			0x00
-+#define LUT_CMD				0x01
-+#define LUT_ADDR			0x02
-+#define LUT_CADDR_SDR			0x03
-+#define LUT_MODE			0x04
-+#define LUT_MODE2			0x05
-+#define LUT_MODE4			0x06
-+#define LUT_MODE8			0x07
-+#define LUT_NXP_WRITE			0x08
-+#define LUT_NXP_READ			0x09
-+#define LUT_LEARN_SDR			0x0A
-+#define LUT_DATSZ_SDR			0x0B
-+#define LUT_DUMMY			0x0C
-+#define LUT_DUMMY_RWDS_SDR		0x0D
-+#define LUT_JMP_ON_CS			0x1F
-+#define LUT_CMD_DDR			0x21
-+#define LUT_ADDR_DDR			0x22
-+#define LUT_CADDR_DDR			0x23
-+#define LUT_MODE_DDR			0x24
-+#define LUT_MODE2_DDR			0x25
-+#define LUT_MODE4_DDR			0x26
-+#define LUT_MODE8_DDR			0x27
-+#define LUT_WRITE_DDR			0x28
-+#define LUT_READ_DDR			0x29
-+#define LUT_LEARN_DDR			0x2A
-+#define LUT_DATSZ_DDR			0x2B
-+#define LUT_DUMMY_DDR			0x2C
-+#define LUT_DUMMY_RWDS_DDR		0x2D
-+
-+/*
-+ * Calculate number of required PAD bits for LUT register.
-+ *
-+ * The pad stands for the number of IO lines [0:7].
-+ * For example, the octal read needs eight IO lines,
-+ * so you should use LUT_PAD(8). This macro
-+ * returns 3 i.e. use eight (2^3) IP lines for read.
-+ */
-+#define LUT_PAD(x) (fls(x) - 1)
-+
-+/*
-+ * Macro for constructing the LUT entries with the following
-+ * register layout:
-+ *
-+ *  ---------------------------------------------------
-+ *  | INSTR1 | PAD1 | OPRND1 | INSTR0 | PAD0 | OPRND0 |
-+ *  ---------------------------------------------------
-+ */
-+#define PAD_SHIFT		8
-+#define INSTR_SHIFT		10
-+#define OPRND_SHIFT		16
-+
-+/* Macros for constructing the LUT register. */
-+#define LUT_DEF(idx, ins, pad, opr)			  \
-+	((((ins) << INSTR_SHIFT) | ((pad) << PAD_SHIFT) | \
-+	(opr)) << (((idx) % 2) * OPRND_SHIFT))
-+
-+#define POLL_TOUT		5000
-+#define NXP_FSPI_MAX_CHIPSELECT		4
-+
-+struct nxp_fspi_devtype_data {
-+	unsigned int rxfifo;
-+	unsigned int txfifo;
-+	unsigned int ahb_buf_size;
-+	unsigned int quirks;
-+	bool little_endian;
-+};
-+
-+static const struct nxp_fspi_devtype_data lx2160a_data = {
-+	.rxfifo = SZ_512,       /* (64  * 64 bits)  */
-+	.txfifo = SZ_1K,        /* (128 * 64 bits)  */
-+	.ahb_buf_size = SZ_2K,  /* (256 * 64 bits)  */
-+	.quirks = 0,
-+	.little_endian = true,  /* little-endian    */
-+};
-+
-+struct nxp_fspi {
-+	void __iomem *iobase;
-+	void __iomem *ahb_addr;
-+	u32 memmap_phy;
-+	u32 memmap_phy_size;
-+	struct clk *clk, *clk_en;
-+	struct device *dev;
-+	struct completion c;
-+	const struct nxp_fspi_devtype_data *devtype_data;
-+	struct mutex lock;
-+	struct pm_qos_request pm_qos_req;
-+	int selected;
-+};
-+
-+/*
-+ * R/W functions for big- or little-endian registers:
-+ * The FSPI controller's endianness is independent of
-+ * the CPU core's endianness. So far, although the CPU
-+ * core is little-endian the FSPI controller can use
-+ * big-endian or little-endian.
-+ */
-+static void fspi_writel(struct nxp_fspi *f, u32 val, void __iomem *addr)
-+{
-+	if (f->devtype_data->little_endian)
-+		iowrite32(val, addr);
-+	else
-+		iowrite32be(val, addr);
-+}
-+
-+static u32 fspi_readl(struct nxp_fspi *f, void __iomem *addr)
-+{
-+	if (f->devtype_data->little_endian)
-+		return ioread32(addr);
-+	else
-+		return ioread32be(addr);
-+}
-+
-+static irqreturn_t nxp_fspi_irq_handler(int irq, void *dev_id)
-+{
-+	struct nxp_fspi *f = dev_id;
-+	u32 reg;
-+
-+	/* clear interrupt */
-+	reg = fspi_readl(f, f->iobase + FSPI_INTR);
-+	fspi_writel(f, FSPI_INTR_IPCMDDONE, f->iobase + FSPI_INTR);
-+
-+	if (reg & FSPI_INTR_IPCMDDONE)
-+		complete(&f->c);
-+
-+	return IRQ_HANDLED;
-+}
-+
-+static int nxp_fspi_check_buswidth(struct nxp_fspi *f, u8 width)
-+{
-+	switch (width) {
-+	case 1:
-+	case 2:
-+	case 4:
-+	case 8:
-+		return 0;
-+	}
-+
-+	return -ENOTSUPP;
-+}
-+
-+static bool nxp_fspi_supports_op(struct spi_mem *mem,
-+				 const struct spi_mem_op *op)
-+{
-+	struct nxp_fspi *f = spi_controller_get_devdata(mem->spi->master);
-+	int ret;
-+
-+	ret = nxp_fspi_check_buswidth(f, op->cmd.buswidth);
-+
-+	if (op->addr.nbytes)
-+		ret |= nxp_fspi_check_buswidth(f, op->addr.buswidth);
-+
-+	if (op->dummy.nbytes)
-+		ret |= nxp_fspi_check_buswidth(f, op->dummy.buswidth);
-+
-+	if (op->data.nbytes)
-+		ret |= nxp_fspi_check_buswidth(f, op->data.buswidth);
-+
-+	if (ret)
-+		return false;
-+
-+	/*
-+	 * The number of address bytes should be equal to or less than 4 bytes.
-+	 */
-+	if (op->addr.nbytes > 4)
-+		return false;
-+
-+	/*
-+	 * If requested address value is greater than controller assigned
-+	 * memory mapped space, return error as it didn't fit in the range
-+	 * of assigned address space.
-+	 */
-+	if (op->addr.val >= f->memmap_phy_size)
-+		return false;
-+
-+	/* Max 64 dummy clock cycles supported */
-+	if (op->dummy.buswidth &&
-+	    (op->dummy.nbytes * 8 / op->dummy.buswidth > 64))
-+		return false;
-+
-+	/* Max data length, check controller limits and alignment */
-+	if (op->data.dir == SPI_MEM_DATA_IN &&
-+	    (op->data.nbytes > f->devtype_data->ahb_buf_size ||
-+	     (op->data.nbytes > f->devtype_data->rxfifo - 4 &&
-+	      !IS_ALIGNED(op->data.nbytes, 8))))
-+		return false;
-+
-+	if (op->data.dir == SPI_MEM_DATA_OUT &&
-+	    op->data.nbytes > f->devtype_data->txfifo)
-+		return false;
-+
-+	return true;
-+}
-+
-+/* Instead of busy looping invoke readl_poll_timeout functionality. */
-+static int fspi_readl_poll_tout(struct nxp_fspi *f, void __iomem *base,
-+				u32 mask, u32 delay_us,
-+				u32 timeout_us, bool c)
-+{
-+	u32 reg;
-+
-+	if (!f->devtype_data->little_endian)
-+		mask = (u32)cpu_to_be32(mask);
-+
-+	if (c)
-+		return readl_poll_timeout(base, reg, (reg & mask),
-+					  delay_us, timeout_us);
-+	else
-+		return readl_poll_timeout(base, reg, !(reg & mask),
-+					  delay_us, timeout_us);
-+}
-+
-+/*
-+ * If the slave device content being changed by Write/Erase, need to
-+ * invalidate the AHB buffer. This can be achieved by doing the reset
-+ * of controller after setting MCR0[SWRESET] bit.
-+ */
-+static inline void nxp_fspi_invalid(struct nxp_fspi *f)
-+{
-+	u32 reg;
-+	int ret;
-+
-+	reg = fspi_readl(f, f->iobase + FSPI_MCR0);
-+	fspi_writel(f, reg | FSPI_MCR0_SWRST, f->iobase + FSPI_MCR0);
-+
-+	/* w1c register, wait unit clear */
-+	ret = fspi_readl_poll_tout(f, f->iobase + FSPI_MCR0,
-+				   FSPI_MCR0_SWRST, 0, POLL_TOUT, false);
-+	WARN_ON(ret);
-+}
-+
-+static void nxp_fspi_prepare_lut(struct nxp_fspi *f,
-+				 const struct spi_mem_op *op)
-+{
-+	void __iomem *base = f->iobase;
-+	u32 lutval[4] = {};
-+	int lutidx = 1, i;
-+
-+	/* cmd */
-+	lutval[0] |= LUT_DEF(0, LUT_CMD, LUT_PAD(op->cmd.buswidth),
-+			     op->cmd.opcode);
-+
-+	/* addr bytes */
-+	if (op->addr.nbytes) {
-+		lutval[lutidx / 2] |= LUT_DEF(lutidx, LUT_ADDR,
-+					      LUT_PAD(op->addr.buswidth),
-+					      op->addr.nbytes * 8);
-+		lutidx++;
-+	}
-+
-+	/* dummy bytes, if needed */
-+	if (op->dummy.nbytes) {
-+		lutval[lutidx / 2] |= LUT_DEF(lutidx, LUT_DUMMY,
-+		/*
-+		 * Due to FlexSPI controller limitation number of PAD for dummy
-+		 * buswidth needs to be programmed as equal to data buswidth.
-+		 */
-+					      LUT_PAD(op->data.buswidth),
-+					      op->dummy.nbytes * 8 /
-+					      op->dummy.buswidth);
-+		lutidx++;
-+	}
-+
-+	/* read/write data bytes */
-+	if (op->data.nbytes) {
-+		lutval[lutidx / 2] |= LUT_DEF(lutidx,
-+					      op->data.dir == SPI_MEM_DATA_IN ?
-+					      LUT_NXP_READ : LUT_NXP_WRITE,
-+					      LUT_PAD(op->data.buswidth),
-+					      0);
-+		lutidx++;
-+	}
-+
-+	/* stop condition. */
-+	lutval[lutidx / 2] |= LUT_DEF(lutidx, LUT_STOP, 0, 0);
-+
-+	/* unlock LUT */
-+	fspi_writel(f, FSPI_LUTKEY_VALUE, f->iobase + FSPI_LUTKEY);
-+	fspi_writel(f, FSPI_LCKER_UNLOCK, f->iobase + FSPI_LCKCR);
-+
-+	/* fill LUT */
-+	for (i = 0; i < ARRAY_SIZE(lutval); i++)
-+		fspi_writel(f, lutval[i], base + FSPI_LUT_REG(i));
-+
-+	dev_dbg(f->dev, "CMD[%x] lutval[0:%x \t 1:%x \t 2:%x \t 3:%x]\n",
-+		op->cmd.opcode, lutval[0], lutval[1], lutval[2], lutval[3]);
-+
-+	/* lock LUT */
-+	fspi_writel(f, FSPI_LUTKEY_VALUE, f->iobase + FSPI_LUTKEY);
-+	fspi_writel(f, FSPI_LCKER_LOCK, f->iobase + FSPI_LCKCR);
-+}
-+
-+static int nxp_fspi_clk_prep_enable(struct nxp_fspi *f)
-+{
-+	int ret;
-+
-+	ret = clk_prepare_enable(f->clk_en);
-+	if (ret)
-+		return ret;
-+
-+	ret = clk_prepare_enable(f->clk);
-+	if (ret) {
-+		clk_disable_unprepare(f->clk_en);
-+		return ret;
-+	}
-+
-+	return 0;
-+}
-+
-+static void nxp_fspi_clk_disable_unprep(struct nxp_fspi *f)
-+{
-+	clk_disable_unprepare(f->clk);
-+	clk_disable_unprepare(f->clk_en);
-+}
-+
-+/*
-+ * In FlexSPI controller, flash access is based on value of FSPI_FLSHXXCR0
-+ * register and start base address of the slave device.
-+ *
-+ *							    (Higher address)
-+ *				--------    <-- FLSHB2CR0
-+ *				|  B2  |
-+ *				|      |
-+ *	B2 start address -->	--------    <-- FLSHB1CR0
-+ *				|  B1  |
-+ *				|      |
-+ *	B1 start address -->	--------    <-- FLSHA2CR0
-+ *				|  A2  |
-+ *				|      |
-+ *	A2 start address -->	--------    <-- FLSHA1CR0
-+ *				|  A1  |
-+ *				|      |
-+ *	A1 start address -->	--------		    (Lower address)
-+ *
-+ *
-+ * Start base address defines the starting address range for given CS and
-+ * FSPI_FLSHXXCR0 defines the size of the slave device connected at given CS.
-+ *
-+ * But, different targets are having different combinations of number of CS,
-+ * some targets only have single CS or two CS covering controller's full
-+ * memory mapped space area.
-+ * Thus, implementation is being done as independent of the size and number
-+ * of the connected slave device.
-+ * Assign controller memory mapped space size as the size to the connected
-+ * slave device.
-+ * Mark FLSHxxCR0 as zero initially and then assign value only to the selected
-+ * chip-select Flash configuration register.
-+ *
-+ * For e.g. to access CS2 (B1), FLSHB1CR0 register would be equal to the
-+ * memory mapped size of the controller.
-+ * Value for rest of the CS FLSHxxCR0 register would be zero.
-+ *
-+ */
-+static void nxp_fspi_select_mem(struct nxp_fspi *f, struct spi_device *spi)
-+{
-+	unsigned long rate = spi->max_speed_hz;
-+	int ret;
-+	uint64_t size_kb;
-+
-+	/*
-+	 * Return, if previously selected slave device is same as current
-+	 * requested slave device.
-+	 */
-+	if (f->selected == spi->chip_select)
-+		return;
-+
-+	/* Reset FLSHxxCR0 registers */
-+	fspi_writel(f, 0, f->iobase + FSPI_FLSHA1CR0);
-+	fspi_writel(f, 0, f->iobase + FSPI_FLSHA2CR0);
-+	fspi_writel(f, 0, f->iobase + FSPI_FLSHB1CR0);
-+	fspi_writel(f, 0, f->iobase + FSPI_FLSHB2CR0);
-+
-+	/* Assign controller memory mapped space as size, KBytes, of flash. */
-+	size_kb = FSPI_FLSHXCR0_SZ(f->memmap_phy_size);
-+
-+	fspi_writel(f, size_kb, f->iobase + FSPI_FLSHA1CR0 +
-+		    4 * spi->chip_select);
-+
-+	dev_dbg(f->dev, "Slave device [CS:%x] selected\n", spi->chip_select);
-+
-+	nxp_fspi_clk_disable_unprep(f);
-+
-+	ret = clk_set_rate(f->clk, rate);
-+	if (ret)
-+		return;
-+
-+	ret = nxp_fspi_clk_prep_enable(f);
-+	if (ret)
-+		return;
-+
-+	f->selected = spi->chip_select;
-+}
-+
-+static void nxp_fspi_read_ahb(struct nxp_fspi *f, const struct spi_mem_op *op)
-+{
-+	u32 len = op->data.nbytes;
-+
-+	/* Read out the data directly from the AHB buffer. */
-+	memcpy_fromio(op->data.buf.in, (f->ahb_addr + op->addr.val), len);
-+}
-+
-+static void nxp_fspi_fill_txfifo(struct nxp_fspi *f,
-+				 const struct spi_mem_op *op)
-+{
-+	void __iomem *base = f->iobase;
-+	int i, ret;
-+	u8 *buf = (u8 *) op->data.buf.out;
-+
-+	/* clear the TX FIFO. */
-+	fspi_writel(f, FSPI_IPTXFCR_CLR, base + FSPI_IPTXFCR);
-+
-+	/*
-+	 * Default value of water mark level is 8 bytes, hence in single
-+	 * write request controller can write max 8 bytes of data.
-+	 */
-+
-+	for (i = 0; i < ALIGN_DOWN(op->data.nbytes, 8); i += 8) {
-+		/* Wait for TXFIFO empty */
-+		ret = fspi_readl_poll_tout(f, f->iobase + FSPI_INTR,
-+					   FSPI_INTR_IPTXWE, 0,
-+					   POLL_TOUT, true);
-+		WARN_ON(ret);
-+
-+		fspi_writel(f, *(u32 *) (buf + i), base + FSPI_TFDR);
-+		fspi_writel(f, *(u32 *) (buf + i + 4), base + FSPI_TFDR + 4);
-+		fspi_writel(f, FSPI_INTR_IPTXWE, base + FSPI_INTR);
-+	}
-+
-+	if (i < op->data.nbytes) {
-+		u32 data = 0;
-+		int j;
-+		/* Wait for TXFIFO empty */
-+		ret = fspi_readl_poll_tout(f, f->iobase + FSPI_INTR,
-+					   FSPI_INTR_IPTXWE, 0,
-+					   POLL_TOUT, true);
-+		WARN_ON(ret);
-+
-+		for (j = 0; j < ALIGN(op->data.nbytes - i, 4); j += 4) {
-+			memcpy(&data, buf + i + j, 4);
-+			fspi_writel(f, data, base + FSPI_TFDR + j);
-+		}
-+		fspi_writel(f, FSPI_INTR_IPTXWE, base + FSPI_INTR);
-+	}
-+}
-+
-+static void nxp_fspi_read_rxfifo(struct nxp_fspi *f,
-+			  const struct spi_mem_op *op)
-+{
-+	void __iomem *base = f->iobase;
-+	int i, ret;
-+	int len = op->data.nbytes;
-+	u8 *buf = (u8 *) op->data.buf.in;
-+
-+	/*
-+	 * Default value of water mark level is 8 bytes, hence in single
-+	 * read request controller can read max 8 bytes of data.
-+	 */
-+	for (i = 0; i < ALIGN_DOWN(len, 8); i += 8) {
-+		/* Wait for RXFIFO available */
-+		ret = fspi_readl_poll_tout(f, f->iobase + FSPI_INTR,
-+					   FSPI_INTR_IPRXWA, 0,
-+					   POLL_TOUT, true);
-+		WARN_ON(ret);
-+
-+		*(u32 *)(buf + i) = fspi_readl(f, base + FSPI_RFDR);
-+		*(u32 *)(buf + i + 4) = fspi_readl(f, base + FSPI_RFDR + 4);
-+		/* move the FIFO pointer */
-+		fspi_writel(f, FSPI_INTR_IPRXWA, base + FSPI_INTR);
-+	}
-+
-+	if (i < len) {
-+		u32 tmp;
-+		int size, j;
-+
-+		buf = op->data.buf.in + i;
-+		/* Wait for RXFIFO available */
-+		ret = fspi_readl_poll_tout(f, f->iobase + FSPI_INTR,
-+					   FSPI_INTR_IPRXWA, 0,
-+					   POLL_TOUT, true);
-+		WARN_ON(ret);
-+
-+		len = op->data.nbytes - i;
-+		for (j = 0; j < op->data.nbytes - i; j += 4) {
-+			tmp = fspi_readl(f, base + FSPI_RFDR + j);
-+			size = min(len, 4);
-+			memcpy(buf + j, &tmp, size);
-+			len -= size;
-+		}
-+	}
-+
-+	/* invalid the RXFIFO */
-+	fspi_writel(f, FSPI_IPRXFCR_CLR, base + FSPI_IPRXFCR);
-+	/* move the FIFO pointer */
-+	fspi_writel(f, FSPI_INTR_IPRXWA, base + FSPI_INTR);
-+}
-+
-+static int nxp_fspi_do_op(struct nxp_fspi *f, const struct spi_mem_op *op)
-+{
-+	void __iomem *base = f->iobase;
-+	int seqnum = 0;
-+	int err = 0;
-+	u32 reg;
-+
-+	reg = fspi_readl(f, base + FSPI_IPRXFCR);
-+	/* invalid RXFIFO first */
-+	reg &= ~FSPI_IPRXFCR_DMA_EN;
-+	reg = reg | FSPI_IPRXFCR_CLR;
-+	fspi_writel(f, reg, base + FSPI_IPRXFCR);
-+
-+	init_completion(&f->c);
-+
-+	fspi_writel(f, op->addr.val, base + FSPI_IPCR0);
-+	/*
-+	 * Always start the sequence at the same index since we update
-+	 * the LUT at each exec_op() call. And also specify the DATA
-+	 * length, since it's has not been specified in the LUT.
-+	 */
-+	fspi_writel(f, op->data.nbytes |
-+		 (SEQID_LUT << FSPI_IPCR1_SEQID_SHIFT) |
-+		 (seqnum << FSPI_IPCR1_SEQNUM_SHIFT),
-+		 base + FSPI_IPCR1);
-+
-+	/* Trigger the LUT now. */
-+	fspi_writel(f, FSPI_IPCMD_TRG, base + FSPI_IPCMD);
-+
-+	/* Wait for the interrupt. */
-+	if (!wait_for_completion_timeout(&f->c, msecs_to_jiffies(1000)))
-+		err = -ETIMEDOUT;
-+
-+	/* Invoke IP data read, if request is of data read. */
-+	if (!err && op->data.nbytes && op->data.dir == SPI_MEM_DATA_IN)
-+		nxp_fspi_read_rxfifo(f, op);
-+
-+	return err;
-+}
-+
-+static int nxp_fspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
-+{
-+	struct nxp_fspi *f = spi_controller_get_devdata(mem->spi->master);
-+	int err = 0;
-+
-+	mutex_lock(&f->lock);
-+
-+	/* Wait for controller being ready. */
-+	err = fspi_readl_poll_tout(f, f->iobase + FSPI_STS0,
-+				   FSPI_STS0_ARB_IDLE, 1, POLL_TOUT, true);
-+	WARN_ON(err);
-+
-+	nxp_fspi_select_mem(f, mem->spi);
-+
-+	nxp_fspi_prepare_lut(f, op);
-+	/*
-+	 * If we have large chunks of data, we read them through the AHB bus
-+	 * by accessing the mapped memory. In all other cases we use
-+	 * IP commands to access the flash.
-+	 */
-+	if (op->data.nbytes > (f->devtype_data->rxfifo - 4) &&
-+	    op->data.dir == SPI_MEM_DATA_IN) {
-+		nxp_fspi_read_ahb(f, op);
-+	} else {
-+		if (op->data.nbytes && op->data.dir == SPI_MEM_DATA_OUT)
-+			nxp_fspi_fill_txfifo(f, op);
-+
-+		err = nxp_fspi_do_op(f, op);
-+	}
-+
-+	/* Invalidate the data in the AHB buffer. */
-+	nxp_fspi_invalid(f);
-+
-+	mutex_unlock(&f->lock);
-+
-+	return err;
-+}
-+
-+static int nxp_fspi_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
-+{
-+	struct nxp_fspi *f = spi_controller_get_devdata(mem->spi->master);
-+
-+	if (op->data.dir == SPI_MEM_DATA_OUT) {
-+		if (op->data.nbytes > f->devtype_data->txfifo)
-+			op->data.nbytes = f->devtype_data->txfifo;
-+	} else {
-+		if (op->data.nbytes > f->devtype_data->ahb_buf_size)
-+			op->data.nbytes = f->devtype_data->ahb_buf_size;
-+		else if (op->data.nbytes > (f->devtype_data->rxfifo - 4))
-+			op->data.nbytes = ALIGN_DOWN(op->data.nbytes, 8);
-+	}
-+
-+	return 0;
-+}
-+
-+static int nxp_fspi_default_setup(struct nxp_fspi *f)
-+{
-+	void __iomem *base = f->iobase;
-+	int ret, i;
-+	u32 reg;
-+
-+	/* disable and unprepare clock to avoid glitch pass to controller */
-+	nxp_fspi_clk_disable_unprep(f);
-+
-+	/* the default frequency, we will change it later if necessary. */
-+	ret = clk_set_rate(f->clk, 20000000);
-+	if (ret)
-+		return ret;
-+
-+	ret = nxp_fspi_clk_prep_enable(f);
-+	if (ret)
-+		return ret;
-+
-+	/* Reset the module */
-+	/* w1c register, wait unit clear */
-+	ret = fspi_readl_poll_tout(f, f->iobase + FSPI_MCR0,
-+				   FSPI_MCR0_SWRST, 0, POLL_TOUT, false);
-+	WARN_ON(ret);
-+
-+	/* Disable the module */
-+	fspi_writel(f, FSPI_MCR0_MDIS, base + FSPI_MCR0);
-+
-+	/* Reset the DLL register to default value */
-+	fspi_writel(f, FSPI_DLLACR_OVRDEN, base + FSPI_DLLACR);
-+	fspi_writel(f, FSPI_DLLBCR_OVRDEN, base + FSPI_DLLBCR);
-+
-+	/* enable module */
-+	fspi_writel(f, FSPI_MCR0_AHB_TIMEOUT(0xFF) | FSPI_MCR0_IP_TIMEOUT(0xFF),
-+		 base + FSPI_MCR0);
-+
-+	/*
-+	 * Disable same device enable bit and configure all slave devices
-+	 * independently.
-+	 */
-+	reg = fspi_readl(f, f->iobase + FSPI_MCR2);
-+	reg = reg & ~(FSPI_MCR2_SAMEDEVICEEN);
-+	fspi_writel(f, reg, base + FSPI_MCR2);
-+
-+	/* AHB configuration for access buffer 0~7. */
-+	for (i = 0; i < 7; i++)
-+		fspi_writel(f, 0, base + FSPI_AHBRX_BUF0CR0 + 4 * i);
-+
-+	/*
-+	 * Set ADATSZ with the maximum AHB buffer size to improve the read
-+	 * performance.
-+	 */
-+	fspi_writel(f, (f->devtype_data->ahb_buf_size / 8 |
-+		  FSPI_AHBRXBUF0CR7_PREF), base + FSPI_AHBRX_BUF7CR0);
-+
-+	/* prefetch and no start address alignment limitation */
-+	fspi_writel(f, FSPI_AHBCR_PREF_EN | FSPI_AHBCR_RDADDROPT,
-+		 base + FSPI_AHBCR);
-+
-+	/* AHB Read - Set lut sequence ID for all CS. */
-+	fspi_writel(f, SEQID_LUT, base + FSPI_FLSHA1CR2);
-+	fspi_writel(f, SEQID_LUT, base + FSPI_FLSHA2CR2);
-+	fspi_writel(f, SEQID_LUT, base + FSPI_FLSHB1CR2);
-+	fspi_writel(f, SEQID_LUT, base + FSPI_FLSHB2CR2);
-+
-+	f->selected = -1;
-+
-+	/* enable the interrupt */
-+	fspi_writel(f, FSPI_INTEN_IPCMDDONE, base + FSPI_INTEN);
-+
-+	return 0;
-+}
-+
-+static const char *nxp_fspi_get_name(struct spi_mem *mem)
-+{
-+	struct nxp_fspi *f = spi_controller_get_devdata(mem->spi->master);
-+	struct device *dev = &mem->spi->dev;
-+	const char *name;
-+
-+	// Set custom name derived from the platform_device of the controller.
-+	if (of_get_available_child_count(f->dev->of_node) == 1)
-+		return dev_name(f->dev);
-+
-+	name = devm_kasprintf(dev, GFP_KERNEL,
-+			      "%s-%d", dev_name(f->dev),
-+			      mem->spi->chip_select);
-+
-+	if (!name) {
-+		dev_err(dev, "failed to get memory for custom flash name\n");
-+		return ERR_PTR(-ENOMEM);
-+	}
-+
-+	return name;
-+}
-+
-+static const struct spi_controller_mem_ops nxp_fspi_mem_ops = {
-+	.adjust_op_size = nxp_fspi_adjust_op_size,
-+	.supports_op = nxp_fspi_supports_op,
-+	.exec_op = nxp_fspi_exec_op,
-+	.get_name = nxp_fspi_get_name,
-+};
-+
-+static int nxp_fspi_probe(struct platform_device *pdev)
-+{
-+	struct spi_controller *ctlr;
-+	struct device *dev = &pdev->dev;
-+	struct device_node *np = dev->of_node;
-+	struct resource *res;
-+	struct nxp_fspi *f;
-+	int ret;
-+
-+	ctlr = spi_alloc_master(&pdev->dev, sizeof(*f));
-+	if (!ctlr)
-+		return -ENOMEM;
-+
-+	ctlr->mode_bits = SPI_RX_DUAL | SPI_RX_QUAD | SPI_RX_OCTAL |
-+			  SPI_TX_DUAL | SPI_TX_QUAD | SPI_TX_OCTAL;
-+
-+	f = spi_controller_get_devdata(ctlr);
-+	f->dev = dev;
-+	f->devtype_data = of_device_get_match_data(dev);
-+	if (!f->devtype_data) {
-+		ret = -ENODEV;
-+		goto err_put_ctrl;
-+	}
-+
-+	platform_set_drvdata(pdev, f);
-+
-+	/* find the resources - configuration register address space */
-+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fspi_base");
-+	f->iobase = devm_ioremap_resource(dev, res);
-+	if (IS_ERR(f->iobase)) {
-+		ret = PTR_ERR(f->iobase);
-+		goto err_put_ctrl;
-+	}
-+
-+	/* find the resources - controller memory mapped space */
-+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fspi_mmap");
-+	f->ahb_addr = devm_ioremap_resource(dev, res);
-+	if (IS_ERR(f->ahb_addr)) {
-+		ret = PTR_ERR(f->ahb_addr);
-+		goto err_put_ctrl;
-+	}
-+
-+	/* assign memory mapped starting address and mapped size. */
-+	f->memmap_phy = res->start;
-+	f->memmap_phy_size = resource_size(res);
-+
-+	/* find the clocks */
-+	f->clk_en = devm_clk_get(dev, "fspi_en");
-+	if (IS_ERR(f->clk_en)) {
-+		ret = PTR_ERR(f->clk_en);
-+		goto err_put_ctrl;
-+	}
-+
-+	f->clk = devm_clk_get(dev, "fspi");
-+	if (IS_ERR(f->clk)) {
-+		ret = PTR_ERR(f->clk);
-+		goto err_put_ctrl;
-+	}
-+
-+	ret = nxp_fspi_clk_prep_enable(f);
-+	if (ret) {
-+		dev_err(dev, "can not enable the clock\n");
-+		goto err_put_ctrl;
-+	}
-+
-+	/* find the irq */
-+	ret = platform_get_irq(pdev, 0);
-+	if (ret < 0) {
-+		dev_err(dev, "failed to get the irq: %d\n", ret);
-+		goto err_disable_clk;
-+	}
-+
-+	ret = devm_request_irq(dev, ret,
-+			nxp_fspi_irq_handler, 0, pdev->name, f);
-+	if (ret) {
-+		dev_err(dev, "failed to request irq: %d\n", ret);
-+		goto err_disable_clk;
-+	}
-+
-+	mutex_init(&f->lock);
-+
-+	ctlr->bus_num = -1;
-+	ctlr->num_chipselect = NXP_FSPI_MAX_CHIPSELECT;
-+	ctlr->mem_ops = &nxp_fspi_mem_ops;
-+
-+	nxp_fspi_default_setup(f);
-+
-+	ctlr->dev.of_node = np;
-+
-+	ret = spi_register_controller(ctlr);
-+	if (ret)
-+		goto err_destroy_mutex;
-+
-+	return 0;
-+
-+err_destroy_mutex:
-+	mutex_destroy(&f->lock);
-+
-+err_disable_clk:
-+	nxp_fspi_clk_disable_unprep(f);
-+
-+err_put_ctrl:
-+	spi_controller_put(ctlr);
-+
-+	dev_err(dev, "NXP FSPI probe failed\n");
-+	return ret;
-+}
-+
-+static int nxp_fspi_remove(struct platform_device *pdev)
-+{
-+	struct nxp_fspi *f = platform_get_drvdata(pdev);
-+
-+	/* disable the hardware */
-+	fspi_writel(f, FSPI_MCR0_MDIS, f->iobase + FSPI_MCR0);
-+
-+	nxp_fspi_clk_disable_unprep(f);
-+
-+	mutex_destroy(&f->lock);
-+
-+	return 0;
-+}
-+
-+static int nxp_fspi_suspend(struct device *dev)
-+{
-+	return 0;
-+}
-+
-+static int nxp_fspi_resume(struct device *dev)
-+{
-+	struct nxp_fspi *f = dev_get_drvdata(dev);
-+
-+	nxp_fspi_default_setup(f);
-+
-+	return 0;
-+}
-+
-+static const struct of_device_id nxp_fspi_dt_ids[] = {
-+	{ .compatible = "nxp,lx2160a-fspi", .data = (void *)&lx2160a_data, },
-+	{ /* sentinel */ }
-+};
-+MODULE_DEVICE_TABLE(of, nxp_fspi_dt_ids);
-+
-+static const struct dev_pm_ops nxp_fspi_pm_ops = {
-+	.suspend	= nxp_fspi_suspend,
-+	.resume		= nxp_fspi_resume,
-+};
-+
-+static struct platform_driver nxp_fspi_driver = {
-+	.driver = {
-+		.name	= "nxp-fspi",
-+		.of_match_table = nxp_fspi_dt_ids,
-+		.pm =   &nxp_fspi_pm_ops,
-+	},
-+	.probe          = nxp_fspi_probe,
-+	.remove		= nxp_fspi_remove,
-+};
-+module_platform_driver(nxp_fspi_driver);
-+
-+MODULE_DESCRIPTION("NXP FSPI Controller Driver");
-+MODULE_AUTHOR("NXP Semiconductor");
-+MODULE_AUTHOR("Yogesh Narayan Gaur <yogeshnarayan.gaur@nxp.com>");
-+MODULE_AUTHOR("Boris Brezillon <bbrezillon@kernel.org>");
-+MODULE_AUTHOR("Frieder Schrempf <frieder.schrempf@kontron.de>");
-+MODULE_LICENSE("GPL v2");
-diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
-index 2fd8881fcd65..8be304379628 100644
---- a/drivers/spi/spi-omap2-mcspi.c
-+++ b/drivers/spi/spi-omap2-mcspi.c
-@@ -623,8 +623,8 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer)
- 	cfg.dst_addr = cs->phys + OMAP2_MCSPI_TX0;
- 	cfg.src_addr_width = width;
- 	cfg.dst_addr_width = width;
--	cfg.src_maxburst = es;
--	cfg.dst_maxburst = es;
-+	cfg.src_maxburst = 1;
-+	cfg.dst_maxburst = 1;
- 
- 	rx = xfer->rx_buf;
- 	tx = xfer->tx_buf;
 diff --git a/drivers/spi/spi-orion.c b/drivers/spi/spi-orion.c
-index 7f280567093e..7d2e9bcc8b30 100644
+index 6643ccdc2508..d7ec35233d7e 100644
 --- a/drivers/spi/spi-orion.c
 +++ b/drivers/spi/spi-orion.c
-@@ -91,10 +91,6 @@ struct orion_direct_acc {
+@@ -88,10 +88,6 @@ struct orion_direct_acc {
  	u32			size;
  };
  
@@ -6518,7 +154,7 @@
  struct orion_spi {
  	struct spi_master	*master;
  	void __iomem		*base;
-@@ -103,7 +99,7 @@ struct orion_spi {
+@@ -100,7 +96,7 @@ struct orion_spi {
  	const struct orion_spi_dev *devdata;
  	int			unused_hw_gpio;
  
@@ -6527,7 +163,7 @@
  };
  
  static inline void __iomem *spi_reg(struct orion_spi *orion_spi, u32 reg)
-@@ -433,7 +429,7 @@ orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
+@@ -430,7 +426,7 @@ orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
  	int cs = spi->chip_select;
  	void __iomem *vaddr;
  
@@ -6536,7 +172,7 @@
  	count = xfer->len;
  
  	orion_spi = spi_master_get_devdata(spi->master);
-@@ -442,7 +438,7 @@ orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
+@@ -439,7 +435,7 @@ orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
  	 * Use SPI direct write mode if base address is available. Otherwise
  	 * fall back to PIO mode for this transfer.
  	 */
@@ -6545,25 +181,7 @@
  
  	if (vaddr && xfer->tx_buf && word_len == 8) {
  		unsigned int cnt = count / 4;
-@@ -470,6 +466,8 @@ orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
- 			if (orion_spi_write_read_8bit(spi, &tx, &rx) < 0)
- 				goto out;
- 			count--;
-+			if (xfer->word_delay_usecs)
-+				udelay(xfer->word_delay_usecs);
- 		} while (count);
- 	} else if (word_len == 16) {
- 		const u16 *tx = xfer->tx_buf;
-@@ -479,6 +477,8 @@ orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
- 			if (orion_spi_write_read_16bit(spi, &tx, &rx) < 0)
- 				goto out;
- 			count -= 2;
-+			if (xfer->word_delay_usecs)
-+				udelay(xfer->word_delay_usecs);
- 		} while (count);
- 	}
- 
-@@ -683,7 +683,6 @@ static int orion_spi_probe(struct platform_device *pdev)
+@@ -684,7 +680,6 @@ static int orion_spi_probe(struct platform_device *pdev)
  	}
  
  	for_each_available_child_of_node(pdev->dev.of_node, np) {
@@ -6571,7 +189,7 @@
  		u32 cs;
  		int cs_gpio;
  
-@@ -751,13 +750,14 @@ static int orion_spi_probe(struct platform_device *pdev)
+@@ -752,13 +747,14 @@ static int orion_spi_probe(struct platform_device *pdev)
  		 * This needs to get extended for the direct SPI-NOR / SPI-NAND
  		 * support, once this gets implemented.
  		 */
@@ -6590,5354 +208,48 @@
  
  		dev_info(&pdev->dev, "CS%d configured for direct access\n", cs);
  	}
-diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c
-index 0c793e31d60f..26684178786f 100644
---- a/drivers/spi/spi-pl022.c
-+++ b/drivers/spi/spi-pl022.c
-@@ -253,6 +253,7 @@
- #define STATE_RUNNING			((void *) 1)
- #define STATE_DONE			((void *) 2)
- #define STATE_ERROR			((void *) -1)
-+#define STATE_TIMEOUT			((void *) -2)
- 
- /*
-  * SSP State - Whether Enabled or Disabled
-@@ -1484,6 +1485,30 @@ static void do_interrupt_dma_transfer(struct pl022 *pl022)
- 	writew(irqflags, SSP_IMSC(pl022->virtbase));
- }
- 
-+static void print_current_status(struct pl022 *pl022)
-+{
-+	u32 read_cr0;
-+	u16 read_cr1, read_dmacr, read_sr;
-+
-+	if (pl022->vendor->extended_cr)
-+		read_cr0 = readl(SSP_CR0(pl022->virtbase));
-+	else
-+		read_cr0 = readw(SSP_CR0(pl022->virtbase));
-+	read_cr1 = readw(SSP_CR1(pl022->virtbase));
-+	read_dmacr = readw(SSP_DMACR(pl022->virtbase));
-+	read_sr = readw(SSP_SR(pl022->virtbase));
-+
-+	dev_warn(&pl022->adev->dev, "spi-pl022 CR0: %x\n", read_cr0);
-+	dev_warn(&pl022->adev->dev, "spi-pl022 CR1: %x\n", read_cr1);
-+	dev_warn(&pl022->adev->dev, "spi-pl022 DMACR: %x\n", read_dmacr);
-+	dev_warn(&pl022->adev->dev, "spi-pl022 SR: %x\n", read_sr);
-+	dev_warn(&pl022->adev->dev,
-+			"spi-pl022 exp_fifo_level/fifodepth: %u/%d\n",
-+			pl022->exp_fifo_level,
-+			pl022->vendor->fifodepth);
-+
-+}
-+
- static void do_polling_transfer(struct pl022 *pl022)
- {
- 	struct spi_message *message = NULL;
-@@ -1535,7 +1560,8 @@ static void do_polling_transfer(struct pl022 *pl022)
- 			if (time_after(time, timeout)) {
- 				dev_warn(&pl022->adev->dev,
- 				"%s: timeout!\n", __func__);
--				message->state = STATE_ERROR;
-+				message->state = STATE_TIMEOUT;
-+				print_current_status(pl022);
- 				goto out;
- 			}
- 			cpu_relax();
-@@ -1553,6 +1579,8 @@ static void do_polling_transfer(struct pl022 *pl022)
- 	/* Handle end of message */
- 	if (message->state == STATE_DONE)
- 		message->status = 0;
-+	else if (message->state == STATE_TIMEOUT)
-+		message->status = -EAGAIN;
- 	else
- 		message->status = -EIO;
- 
-diff --git a/drivers/spi/spi-pxa2xx-dma.c b/drivers/spi/spi-pxa2xx-dma.c
-index 2fa7f4b43492..15592598273e 100644
---- a/drivers/spi/spi-pxa2xx-dma.c
-+++ b/drivers/spi/spi-pxa2xx-dma.c
-@@ -23,7 +23,7 @@
- static void pxa2xx_spi_dma_transfer_complete(struct driver_data *drv_data,
- 					     bool error)
- {
--	struct spi_message *msg = drv_data->master->cur_msg;
-+	struct spi_message *msg = drv_data->controller->cur_msg;
- 
- 	/*
- 	 * It is possible that one CPU is handling ROR interrupt and other
-@@ -59,7 +59,7 @@ static void pxa2xx_spi_dma_transfer_complete(struct driver_data *drv_data,
- 			msg->status = -EIO;
- 		}
- 
--		spi_finalize_current_transfer(drv_data->master);
-+		spi_finalize_current_transfer(drv_data->controller);
- 	}
- }
- 
-@@ -74,7 +74,7 @@ pxa2xx_spi_dma_prepare_one(struct driver_data *drv_data,
- 			   struct spi_transfer *xfer)
- {
- 	struct chip_data *chip =
--		spi_get_ctldata(drv_data->master->cur_msg->spi);
-+		spi_get_ctldata(drv_data->controller->cur_msg->spi);
- 	enum dma_slave_buswidth width;
- 	struct dma_slave_config cfg;
- 	struct dma_chan *chan;
-@@ -102,14 +102,14 @@ pxa2xx_spi_dma_prepare_one(struct driver_data *drv_data,
- 		cfg.dst_maxburst = chip->dma_burst_size;
- 
- 		sgt = &xfer->tx_sg;
--		chan = drv_data->master->dma_tx;
-+		chan = drv_data->controller->dma_tx;
- 	} else {
- 		cfg.src_addr = drv_data->ssdr_physical;
- 		cfg.src_addr_width = width;
- 		cfg.src_maxburst = chip->dma_burst_size;
- 
- 		sgt = &xfer->rx_sg;
--		chan = drv_data->master->dma_rx;
-+		chan = drv_data->controller->dma_rx;
- 	}
- 
- 	ret = dmaengine_slave_config(chan, &cfg);
-@@ -130,8 +130,8 @@ irqreturn_t pxa2xx_spi_dma_transfer(struct driver_data *drv_data)
- 	if (status & SSSR_ROR) {
- 		dev_err(&drv_data->pdev->dev, "FIFO overrun\n");
- 
--		dmaengine_terminate_async(drv_data->master->dma_rx);
--		dmaengine_terminate_async(drv_data->master->dma_tx);
-+		dmaengine_terminate_async(drv_data->controller->dma_rx);
-+		dmaengine_terminate_async(drv_data->controller->dma_tx);
- 
- 		pxa2xx_spi_dma_transfer_complete(drv_data, true);
- 		return IRQ_HANDLED;
-@@ -171,15 +171,15 @@ int pxa2xx_spi_dma_prepare(struct driver_data *drv_data,
- 	return 0;
- 
- err_rx:
--	dmaengine_terminate_async(drv_data->master->dma_tx);
-+	dmaengine_terminate_async(drv_data->controller->dma_tx);
- err_tx:
- 	return err;
- }
- 
- void pxa2xx_spi_dma_start(struct driver_data *drv_data)
- {
--	dma_async_issue_pending(drv_data->master->dma_rx);
--	dma_async_issue_pending(drv_data->master->dma_tx);
-+	dma_async_issue_pending(drv_data->controller->dma_rx);
-+	dma_async_issue_pending(drv_data->controller->dma_tx);
- 
- 	atomic_set(&drv_data->dma_running, 1);
- }
-@@ -187,30 +187,30 @@ void pxa2xx_spi_dma_start(struct driver_data *drv_data)
- void pxa2xx_spi_dma_stop(struct driver_data *drv_data)
- {
- 	atomic_set(&drv_data->dma_running, 0);
--	dmaengine_terminate_sync(drv_data->master->dma_rx);
--	dmaengine_terminate_sync(drv_data->master->dma_tx);
-+	dmaengine_terminate_sync(drv_data->controller->dma_rx);
-+	dmaengine_terminate_sync(drv_data->controller->dma_tx);
- }
- 
- int pxa2xx_spi_dma_setup(struct driver_data *drv_data)
- {
--	struct pxa2xx_spi_master *pdata = drv_data->master_info;
-+	struct pxa2xx_spi_controller *pdata = drv_data->controller_info;
- 	struct device *dev = &drv_data->pdev->dev;
--	struct spi_controller *master = drv_data->master;
-+	struct spi_controller *controller = drv_data->controller;
- 	dma_cap_mask_t mask;
- 
- 	dma_cap_zero(mask);
- 	dma_cap_set(DMA_SLAVE, mask);
- 
--	master->dma_tx = dma_request_slave_channel_compat(mask,
-+	controller->dma_tx = dma_request_slave_channel_compat(mask,
- 				pdata->dma_filter, pdata->tx_param, dev, "tx");
--	if (!master->dma_tx)
-+	if (!controller->dma_tx)
- 		return -ENODEV;
- 
--	master->dma_rx = dma_request_slave_channel_compat(mask,
-+	controller->dma_rx = dma_request_slave_channel_compat(mask,
- 				pdata->dma_filter, pdata->rx_param, dev, "rx");
--	if (!master->dma_rx) {
--		dma_release_channel(master->dma_tx);
--		master->dma_tx = NULL;
-+	if (!controller->dma_rx) {
-+		dma_release_channel(controller->dma_tx);
-+		controller->dma_tx = NULL;
- 		return -ENODEV;
- 	}
- 
-@@ -219,17 +219,17 @@ int pxa2xx_spi_dma_setup(struct driver_data *drv_data)
- 
- void pxa2xx_spi_dma_release(struct driver_data *drv_data)
- {
--	struct spi_controller *master = drv_data->master;
-+	struct spi_controller *controller = drv_data->controller;
- 
--	if (master->dma_rx) {
--		dmaengine_terminate_sync(master->dma_rx);
--		dma_release_channel(master->dma_rx);
--		master->dma_rx = NULL;
-+	if (controller->dma_rx) {
-+		dmaengine_terminate_sync(controller->dma_rx);
-+		dma_release_channel(controller->dma_rx);
-+		controller->dma_rx = NULL;
- 	}
--	if (master->dma_tx) {
--		dmaengine_terminate_sync(master->dma_tx);
--		dma_release_channel(master->dma_tx);
--		master->dma_tx = NULL;
-+	if (controller->dma_tx) {
-+		dmaengine_terminate_sync(controller->dma_tx);
-+		dma_release_channel(controller->dma_tx);
-+		controller->dma_tx = NULL;
- 	}
- }
- 
-diff --git a/drivers/spi/spi-pxa2xx-pci.c b/drivers/spi/spi-pxa2xx-pci.c
-index 869f188b02eb..1727fdfbac28 100644
---- a/drivers/spi/spi-pxa2xx-pci.c
-+++ b/drivers/spi/spi-pxa2xx-pci.c
-@@ -197,7 +197,7 @@ static int pxa2xx_spi_pci_probe(struct pci_dev *dev,
- 	struct platform_device_info pi;
- 	int ret;
- 	struct platform_device *pdev;
--	struct pxa2xx_spi_master spi_pdata;
-+	struct pxa2xx_spi_controller spi_pdata;
- 	struct ssp_device *ssp;
- 	struct pxa_spi_info *c;
- 	char buf[40];
-@@ -265,7 +265,7 @@ static int pxa2xx_spi_pci_probe(struct pci_dev *dev,
- static void pxa2xx_spi_pci_remove(struct pci_dev *dev)
- {
- 	struct platform_device *pdev = pci_get_drvdata(dev);
--	struct pxa2xx_spi_master *spi_pdata;
-+	struct pxa2xx_spi_controller *spi_pdata;
- 
- 	spi_pdata = dev_get_platdata(&pdev->dev);
- 
-diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
-index d84b893a64d7..b6ddba833d02 100644
---- a/drivers/spi/spi-pxa2xx.c
-+++ b/drivers/spi/spi-pxa2xx.c
-@@ -328,7 +328,7 @@ static void lpss_ssp_setup(struct driver_data *drv_data)
- 	__lpss_ssp_write_priv(drv_data, config->reg_cs_ctrl, value);
- 
- 	/* Enable multiblock DMA transfers */
--	if (drv_data->master_info->enable_dma) {
-+	if (drv_data->controller_info->enable_dma) {
- 		__lpss_ssp_write_priv(drv_data, config->reg_ssp, 1);
- 
- 		if (config->reg_general >= 0) {
-@@ -368,7 +368,7 @@ static void lpss_ssp_select_cs(struct spi_device *spi,
- 		__lpss_ssp_write_priv(drv_data,
- 				      config->reg_cs_ctrl, value);
- 		ndelay(1000000000 /
--		       (drv_data->master->max_speed_hz / 2));
-+		       (drv_data->controller->max_speed_hz / 2));
- 	}
- }
- 
-@@ -567,7 +567,7 @@ static int u32_reader(struct driver_data *drv_data)
- static void reset_sccr1(struct driver_data *drv_data)
- {
- 	struct chip_data *chip =
--		spi_get_ctldata(drv_data->master->cur_msg->spi);
-+		spi_get_ctldata(drv_data->controller->cur_msg->spi);
- 	u32 sccr1_reg;
- 
- 	sccr1_reg = pxa2xx_spi_read(drv_data, SSCR1) & ~drv_data->int_cr1;
-@@ -599,8 +599,8 @@ static void int_error_stop(struct driver_data *drv_data, const char* msg)
- 
- 	dev_err(&drv_data->pdev->dev, "%s\n", msg);
- 
--	drv_data->master->cur_msg->status = -EIO;
--	spi_finalize_current_transfer(drv_data->master);
-+	drv_data->controller->cur_msg->status = -EIO;
-+	spi_finalize_current_transfer(drv_data->controller);
- }
- 
- static void int_transfer_complete(struct driver_data *drv_data)
-@@ -611,7 +611,7 @@ static void int_transfer_complete(struct driver_data *drv_data)
- 	if (!pxa25x_ssp_comp(drv_data))
- 		pxa2xx_spi_write(drv_data, SSTO, 0);
- 
--	spi_finalize_current_transfer(drv_data->master);
-+	spi_finalize_current_transfer(drv_data->controller);
- }
- 
- static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
-@@ -747,7 +747,7 @@ static irqreturn_t ssp_int(int irq, void *dev_id)
- 	pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg & ~drv_data->int_cr1);
- 	pxa2xx_spi_write(drv_data, SSCR1, sccr1_reg);
- 
--	if (!drv_data->master->cur_msg) {
-+	if (!drv_data->controller->cur_msg) {
- 		handle_bad_msg(drv_data);
- 		/* Never fail */
- 		return IRQ_HANDLED;
-@@ -879,7 +879,7 @@ static unsigned int quark_x1000_get_clk_div(int rate, u32 *dds)
- 
- static unsigned int ssp_get_clk_div(struct driver_data *drv_data, int rate)
- {
--	unsigned long ssp_clk = drv_data->master->max_speed_hz;
-+	unsigned long ssp_clk = drv_data->controller->max_speed_hz;
- 	const struct ssp_device *ssp = drv_data->ssp;
- 
- 	rate = min_t(int, ssp_clk, rate);
-@@ -894,7 +894,7 @@ static unsigned int pxa2xx_ssp_get_clk_div(struct driver_data *drv_data,
- 					   int rate)
- {
- 	struct chip_data *chip =
--		spi_get_ctldata(drv_data->master->cur_msg->spi);
-+		spi_get_ctldata(drv_data->controller->cur_msg->spi);
- 	unsigned int clk_div;
- 
- 	switch (drv_data->ssp_type) {
-@@ -908,7 +908,7 @@ static unsigned int pxa2xx_ssp_get_clk_div(struct driver_data *drv_data,
- 	return clk_div << 8;
- }
- 
--static bool pxa2xx_spi_can_dma(struct spi_controller *master,
-+static bool pxa2xx_spi_can_dma(struct spi_controller *controller,
- 			       struct spi_device *spi,
- 			       struct spi_transfer *xfer)
- {
-@@ -919,12 +919,12 @@ static bool pxa2xx_spi_can_dma(struct spi_controller *master,
- 	       xfer->len >= chip->dma_burst_size;
- }
- 
--static int pxa2xx_spi_transfer_one(struct spi_controller *master,
-+static int pxa2xx_spi_transfer_one(struct spi_controller *controller,
- 				   struct spi_device *spi,
- 				   struct spi_transfer *transfer)
- {
--	struct driver_data *drv_data = spi_controller_get_devdata(master);
--	struct spi_message *message = master->cur_msg;
-+	struct driver_data *drv_data = spi_controller_get_devdata(controller);
-+	struct spi_message *message = controller->cur_msg;
- 	struct chip_data *chip = spi_get_ctldata(message->spi);
- 	u32 dma_thresh = chip->dma_threshold;
- 	u32 dma_burst = chip->dma_burst_size;
-@@ -1006,9 +1006,9 @@ static int pxa2xx_spi_transfer_one(struct spi_controller *master,
- 					     "DMA burst size reduced to match bits_per_word\n");
- 	}
- 
--	dma_mapped = master->can_dma &&
--		     master->can_dma(master, message->spi, transfer) &&
--		     master->cur_msg_mapped;
-+	dma_mapped = controller->can_dma &&
-+		     controller->can_dma(controller, message->spi, transfer) &&
-+		     controller->cur_msg_mapped;
- 	if (dma_mapped) {
- 
- 		/* Ensure we have the correct interrupt handler */
-@@ -1036,12 +1036,12 @@ static int pxa2xx_spi_transfer_one(struct spi_controller *master,
- 	cr0 = pxa2xx_configure_sscr0(drv_data, clk_div, bits);
- 	if (!pxa25x_ssp_comp(drv_data))
- 		dev_dbg(&message->spi->dev, "%u Hz actual, %s\n",
--			master->max_speed_hz
-+			controller->max_speed_hz
- 				/ (1 + ((cr0 & SSCR0_SCR(0xfff)) >> 8)),
- 			dma_mapped ? "DMA" : "PIO");
- 	else
- 		dev_dbg(&message->spi->dev, "%u Hz actual, %s\n",
--			master->max_speed_hz / 2
-+			controller->max_speed_hz / 2
- 				/ (1 + ((cr0 & SSCR0_SCR(0x0ff)) >> 8)),
- 			dma_mapped ? "DMA" : "PIO");
- 
-@@ -1092,7 +1092,7 @@ static int pxa2xx_spi_transfer_one(struct spi_controller *master,
- 		}
- 	}
- 
--	if (spi_controller_is_slave(master)) {
-+	if (spi_controller_is_slave(controller)) {
- 		while (drv_data->write(drv_data))
- 			;
- 		if (drv_data->gpiod_ready) {
-@@ -1111,9 +1111,9 @@ static int pxa2xx_spi_transfer_one(struct spi_controller *master,
- 	return 1;
- }
- 
--static int pxa2xx_spi_slave_abort(struct spi_master *master)
-+static int pxa2xx_spi_slave_abort(struct spi_controller *controller)
- {
--	struct driver_data *drv_data = spi_controller_get_devdata(master);
-+	struct driver_data *drv_data = spi_controller_get_devdata(controller);
- 
- 	/* Stop and reset SSP */
- 	write_SSSR_CS(drv_data, drv_data->clear_sr);
-@@ -1126,16 +1126,16 @@ static int pxa2xx_spi_slave_abort(struct spi_master *master)
- 
- 	dev_dbg(&drv_data->pdev->dev, "transfer aborted\n");
- 
--	drv_data->master->cur_msg->status = -EINTR;
--	spi_finalize_current_transfer(drv_data->master);
-+	drv_data->controller->cur_msg->status = -EINTR;
-+	spi_finalize_current_transfer(drv_data->controller);
- 
- 	return 0;
- }
- 
--static void pxa2xx_spi_handle_err(struct spi_controller *master,
-+static void pxa2xx_spi_handle_err(struct spi_controller *controller,
- 				 struct spi_message *msg)
- {
--	struct driver_data *drv_data = spi_controller_get_devdata(master);
-+	struct driver_data *drv_data = spi_controller_get_devdata(controller);
- 
- 	/* Disable the SSP */
- 	pxa2xx_spi_write(drv_data, SSCR0,
-@@ -1159,9 +1159,9 @@ static void pxa2xx_spi_handle_err(struct spi_controller *master,
- 		pxa2xx_spi_dma_stop(drv_data);
- }
- 
--static int pxa2xx_spi_unprepare_transfer(struct spi_controller *master)
-+static int pxa2xx_spi_unprepare_transfer(struct spi_controller *controller)
- {
--	struct driver_data *drv_data = spi_controller_get_devdata(master);
-+	struct driver_data *drv_data = spi_controller_get_devdata(controller);
- 
- 	/* Disable the SSP now */
- 	pxa2xx_spi_write(drv_data, SSCR0,
-@@ -1260,7 +1260,7 @@ static int setup(struct spi_device *spi)
- 		break;
- 	default:
- 		tx_hi_thres = 0;
--		if (spi_controller_is_slave(drv_data->master)) {
-+		if (spi_controller_is_slave(drv_data->controller)) {
- 			tx_thres = 1;
- 			rx_thres = 2;
- 		} else {
-@@ -1287,7 +1287,7 @@ static int setup(struct spi_device *spi)
- 
- 			chip->frm = spi->chip_select;
- 		}
--		chip->enable_dma = drv_data->master_info->enable_dma;
-+		chip->enable_dma = drv_data->controller_info->enable_dma;
- 		chip->timeout = TIMOUT_DFLT;
- 	}
- 
-@@ -1310,7 +1310,7 @@ static int setup(struct spi_device *spi)
- 		if (chip_info->enable_loopback)
- 			chip->cr1 = SSCR1_LBM;
- 	}
--	if (spi_controller_is_slave(drv_data->master)) {
-+	if (spi_controller_is_slave(drv_data->controller)) {
- 		chip->cr1 |= SSCR1_SCFR;
- 		chip->cr1 |= SSCR1_SCLKDIR;
- 		chip->cr1 |= SSCR1_SFRMDIR;
-@@ -1497,10 +1497,10 @@ static bool pxa2xx_spi_idma_filter(struct dma_chan *chan, void *param)
- 
- #endif /* CONFIG_PCI */
- 
--static struct pxa2xx_spi_master *
-+static struct pxa2xx_spi_controller *
- pxa2xx_spi_init_pdata(struct platform_device *pdev)
- {
--	struct pxa2xx_spi_master *pdata;
-+	struct pxa2xx_spi_controller *pdata;
- 	struct acpi_device *adev;
- 	struct ssp_device *ssp;
- 	struct resource *res;
-@@ -1568,10 +1568,10 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)
- 	return pdata;
- }
- 
--static int pxa2xx_spi_fw_translate_cs(struct spi_controller *master,
-+static int pxa2xx_spi_fw_translate_cs(struct spi_controller *controller,
- 				      unsigned int cs)
- {
--	struct driver_data *drv_data = spi_controller_get_devdata(master);
-+	struct driver_data *drv_data = spi_controller_get_devdata(controller);
- 
- 	if (has_acpi_companion(&drv_data->pdev->dev)) {
- 		switch (drv_data->ssp_type) {
-@@ -1595,8 +1595,8 @@ static int pxa2xx_spi_fw_translate_cs(struct spi_controller *master,
- static int pxa2xx_spi_probe(struct platform_device *pdev)
- {
- 	struct device *dev = &pdev->dev;
--	struct pxa2xx_spi_master *platform_info;
--	struct spi_controller *master;
-+	struct pxa2xx_spi_controller *platform_info;
-+	struct spi_controller *controller;
- 	struct driver_data *drv_data;
- 	struct ssp_device *ssp;
- 	const struct lpss_config *config;
-@@ -1622,37 +1622,37 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
- 	}
- 
- 	if (platform_info->is_slave)
--		master = spi_alloc_slave(dev, sizeof(struct driver_data));
-+		controller = spi_alloc_slave(dev, sizeof(struct driver_data));
- 	else
--		master = spi_alloc_master(dev, sizeof(struct driver_data));
-+		controller = spi_alloc_master(dev, sizeof(struct driver_data));
- 
--	if (!master) {
--		dev_err(&pdev->dev, "cannot alloc spi_master\n");
-+	if (!controller) {
-+		dev_err(&pdev->dev, "cannot alloc spi_controller\n");
- 		pxa_ssp_free(ssp);
- 		return -ENOMEM;
- 	}
--	drv_data = spi_controller_get_devdata(master);
--	drv_data->master = master;
--	drv_data->master_info = platform_info;
-+	drv_data = spi_controller_get_devdata(controller);
-+	drv_data->controller = controller;
-+	drv_data->controller_info = platform_info;
- 	drv_data->pdev = pdev;
- 	drv_data->ssp = ssp;
- 
--	master->dev.of_node = pdev->dev.of_node;
-+	controller->dev.of_node = pdev->dev.of_node;
- 	/* the spi->mode bits understood by this driver: */
--	master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LOOP;
--
--	master->bus_num = ssp->port_id;
--	master->dma_alignment = DMA_ALIGNMENT;
--	master->cleanup = cleanup;
--	master->setup = setup;
--	master->set_cs = pxa2xx_spi_set_cs;
--	master->transfer_one = pxa2xx_spi_transfer_one;
--	master->slave_abort = pxa2xx_spi_slave_abort;
--	master->handle_err = pxa2xx_spi_handle_err;
--	master->unprepare_transfer_hardware = pxa2xx_spi_unprepare_transfer;
--	master->fw_translate_cs = pxa2xx_spi_fw_translate_cs;
--	master->auto_runtime_pm = true;
--	master->flags = SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX;
-+	controller->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LOOP;
-+
-+	controller->bus_num = ssp->port_id;
-+	controller->dma_alignment = DMA_ALIGNMENT;
-+	controller->cleanup = cleanup;
-+	controller->setup = setup;
-+	controller->set_cs = pxa2xx_spi_set_cs;
-+	controller->transfer_one = pxa2xx_spi_transfer_one;
-+	controller->slave_abort = pxa2xx_spi_slave_abort;
-+	controller->handle_err = pxa2xx_spi_handle_err;
-+	controller->unprepare_transfer_hardware = pxa2xx_spi_unprepare_transfer;
-+	controller->fw_translate_cs = pxa2xx_spi_fw_translate_cs;
-+	controller->auto_runtime_pm = true;
-+	controller->flags = SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX;
- 
- 	drv_data->ssp_type = ssp->type;
- 
-@@ -1661,10 +1661,10 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
- 	if (pxa25x_ssp_comp(drv_data)) {
- 		switch (drv_data->ssp_type) {
- 		case QUARK_X1000_SSP:
--			master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32);
-+			controller->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32);
- 			break;
- 		default:
--			master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 16);
-+			controller->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 16);
- 			break;
- 		}
- 
-@@ -1673,7 +1673,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
- 		drv_data->clear_sr = SSSR_ROR;
- 		drv_data->mask_sr = SSSR_RFS | SSSR_TFS | SSSR_ROR;
- 	} else {
--		master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32);
-+		controller->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32);
- 		drv_data->int_cr1 = SSCR1_TIE | SSCR1_RIE | SSCR1_TINTE;
- 		drv_data->dma_cr1 = DEFAULT_DMA_CR1;
- 		drv_data->clear_sr = SSSR_ROR | SSSR_TINT;
-@@ -1685,7 +1685,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
- 			drv_data);
- 	if (status < 0) {
- 		dev_err(&pdev->dev, "cannot get IRQ %d\n", ssp->irq);
--		goto out_error_master_alloc;
-+		goto out_error_controller_alloc;
- 	}
- 
- 	/* Setup DMA if requested */
-@@ -1695,7 +1695,8 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
- 			dev_dbg(dev, "no DMA channels available, using PIO\n");
- 			platform_info->enable_dma = false;
- 		} else {
--			master->can_dma = pxa2xx_spi_can_dma;
-+			controller->can_dma = pxa2xx_spi_can_dma;
-+			controller->max_dma_len = MAX_DMA_LEN;
- 		}
- 	}
- 
-@@ -1704,7 +1705,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
- 	if (status)
- 		goto out_error_dma_irq_alloc;
- 
--	master->max_speed_hz = clk_get_rate(ssp->clk);
-+	controller->max_speed_hz = clk_get_rate(ssp->clk);
- 
- 	/* Load default SSP configuration */
- 	pxa2xx_spi_write(drv_data, SSCR0, 0);
-@@ -1727,7 +1728,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
- 		break;
- 	default:
- 
--		if (spi_controller_is_slave(master)) {
-+		if (spi_controller_is_slave(controller)) {
- 			tmp = SSCR1_SCFR |
- 			      SSCR1_SCLKDIR |
- 			      SSCR1_SFRMDIR |
-@@ -1740,7 +1741,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
- 		}
- 		pxa2xx_spi_write(drv_data, SSCR1, tmp);
- 		tmp = SSCR0_Motorola | SSCR0_DataSize(8);
--		if (!spi_controller_is_slave(master))
-+		if (!spi_controller_is_slave(controller))
- 			tmp |= SSCR0_SCR(2);
- 		pxa2xx_spi_write(drv_data, SSCR0, tmp);
- 		break;
-@@ -1765,24 +1766,24 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
- 			platform_info->num_chipselect = config->cs_num;
- 		}
- 	}
--	master->num_chipselect = platform_info->num_chipselect;
-+	controller->num_chipselect = platform_info->num_chipselect;
- 
- 	count = gpiod_count(&pdev->dev, "cs");
- 	if (count > 0) {
- 		int i;
- 
--		master->num_chipselect = max_t(int, count,
--			master->num_chipselect);
-+		controller->num_chipselect = max_t(int, count,
-+			controller->num_chipselect);
- 
- 		drv_data->cs_gpiods = devm_kcalloc(&pdev->dev,
--			master->num_chipselect, sizeof(struct gpio_desc *),
-+			controller->num_chipselect, sizeof(struct gpio_desc *),
- 			GFP_KERNEL);
- 		if (!drv_data->cs_gpiods) {
- 			status = -ENOMEM;
- 			goto out_error_clock_enabled;
- 		}
- 
--		for (i = 0; i < master->num_chipselect; i++) {
-+		for (i = 0; i < controller->num_chipselect; i++) {
- 			struct gpio_desc *gpiod;
- 
- 			gpiod = devm_gpiod_get_index(dev, "cs", i, GPIOD_ASIS);
-@@ -1815,9 +1816,9 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
- 
- 	/* Register with the SPI framework */
- 	platform_set_drvdata(pdev, drv_data);
--	status = devm_spi_register_controller(&pdev->dev, master);
-+	status = devm_spi_register_controller(&pdev->dev, controller);
- 	if (status != 0) {
--		dev_err(&pdev->dev, "problem registering spi master\n");
-+		dev_err(&pdev->dev, "problem registering spi controller\n");
- 		goto out_error_clock_enabled;
- 	}
- 
-@@ -1832,8 +1833,8 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
- 	pxa2xx_spi_dma_release(drv_data);
- 	free_irq(ssp->irq, drv_data);
- 
--out_error_master_alloc:
--	spi_controller_put(master);
-+out_error_controller_alloc:
-+	spi_controller_put(controller);
- 	pxa_ssp_free(ssp);
- 	return status;
- }
-@@ -1854,7 +1855,7 @@ static int pxa2xx_spi_remove(struct platform_device *pdev)
- 	clk_disable_unprepare(ssp->clk);
- 
- 	/* Release DMA */
--	if (drv_data->master_info->enable_dma)
-+	if (drv_data->controller_info->enable_dma)
- 		pxa2xx_spi_dma_release(drv_data);
- 
- 	pm_runtime_put_noidle(&pdev->dev);
-@@ -1876,7 +1877,7 @@ static int pxa2xx_spi_suspend(struct device *dev)
- 	struct ssp_device *ssp = drv_data->ssp;
- 	int status;
- 
--	status = spi_controller_suspend(drv_data->master);
-+	status = spi_controller_suspend(drv_data->controller);
- 	if (status != 0)
- 		return status;
- 	pxa2xx_spi_write(drv_data, SSCR0, 0);
-@@ -1901,7 +1902,7 @@ static int pxa2xx_spi_resume(struct device *dev)
- 	}
- 
- 	/* Start the queue running */
--	return spi_controller_resume(drv_data->master);
-+	return spi_controller_resume(drv_data->controller);
- }
- #endif
- 
-diff --git a/drivers/spi/spi-pxa2xx.h b/drivers/spi/spi-pxa2xx.h
-index 4e324da66ef7..aba777b4502d 100644
---- a/drivers/spi/spi-pxa2xx.h
-+++ b/drivers/spi/spi-pxa2xx.h
-@@ -31,10 +31,10 @@ struct driver_data {
- 
- 	/* SPI framework hookup */
- 	enum pxa_ssp_type ssp_type;
--	struct spi_controller *master;
-+	struct spi_controller *controller;
- 
- 	/* PXA hookup */
--	struct pxa2xx_spi_master *master_info;
-+	struct pxa2xx_spi_controller *controller_info;
- 
- 	/* SSP register addresses */
- 	void __iomem *ioaddr;
-diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c
-index a4ef641b5227..556870dcdf79 100644
---- a/drivers/spi/spi-rspi.c
-+++ b/drivers/spi/spi-rspi.c
-@@ -180,7 +180,7 @@
- struct rspi_data {
- 	void __iomem *addr;
- 	u32 max_speed_hz;
--	struct spi_master *master;
-+	struct spi_controller *ctlr;
- 	wait_queue_head_t wait;
- 	struct clk *clk;
- 	u16 spcmd;
-@@ -237,8 +237,8 @@ static u16 rspi_read_data(const struct rspi_data *rspi)
- /* optional functions */
- struct spi_ops {
- 	int (*set_config_register)(struct rspi_data *rspi, int access_size);
--	int (*transfer_one)(struct spi_master *master, struct spi_device *spi,
--			    struct spi_transfer *xfer);
-+	int (*transfer_one)(struct spi_controller *ctlr,
-+			    struct spi_device *spi, struct spi_transfer *xfer);
- 	u16 mode_bits;
- 	u16 flags;
- 	u16 fifo_size;
-@@ -466,7 +466,7 @@ static int rspi_data_out(struct rspi_data *rspi, u8 data)
- {
- 	int error = rspi_wait_for_tx_empty(rspi);
- 	if (error < 0) {
--		dev_err(&rspi->master->dev, "transmit timeout\n");
-+		dev_err(&rspi->ctlr->dev, "transmit timeout\n");
- 		return error;
- 	}
- 	rspi_write_data(rspi, data);
-@@ -480,7 +480,7 @@ static int rspi_data_in(struct rspi_data *rspi)
- 
- 	error = rspi_wait_for_rx_full(rspi);
- 	if (error < 0) {
--		dev_err(&rspi->master->dev, "receive timeout\n");
-+		dev_err(&rspi->ctlr->dev, "receive timeout\n");
- 		return error;
- 	}
- 	data = rspi_read_data(rspi);
-@@ -526,8 +526,8 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx,
- 
- 	/* First prepare and submit the DMA request(s), as this may fail */
- 	if (rx) {
--		desc_rx = dmaengine_prep_slave_sg(rspi->master->dma_rx,
--					rx->sgl, rx->nents, DMA_DEV_TO_MEM,
-+		desc_rx = dmaengine_prep_slave_sg(rspi->ctlr->dma_rx, rx->sgl,
-+					rx->nents, DMA_DEV_TO_MEM,
- 					DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
- 		if (!desc_rx) {
- 			ret = -EAGAIN;
-@@ -546,8 +546,8 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx,
- 	}
- 
- 	if (tx) {
--		desc_tx = dmaengine_prep_slave_sg(rspi->master->dma_tx,
--					tx->sgl, tx->nents, DMA_MEM_TO_DEV,
-+		desc_tx = dmaengine_prep_slave_sg(rspi->ctlr->dma_tx, tx->sgl,
-+					tx->nents, DMA_MEM_TO_DEV,
- 					DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
- 		if (!desc_tx) {
- 			ret = -EAGAIN;
-@@ -584,9 +584,9 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx,
- 
- 	/* Now start DMA */
- 	if (rx)
--		dma_async_issue_pending(rspi->master->dma_rx);
-+		dma_async_issue_pending(rspi->ctlr->dma_rx);
- 	if (tx)
--		dma_async_issue_pending(rspi->master->dma_tx);
-+		dma_async_issue_pending(rspi->ctlr->dma_tx);
- 
- 	ret = wait_event_interruptible_timeout(rspi->wait,
- 					       rspi->dma_callbacked, HZ);
-@@ -594,13 +594,13 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx,
- 		ret = 0;
- 	} else {
- 		if (!ret) {
--			dev_err(&rspi->master->dev, "DMA timeout\n");
-+			dev_err(&rspi->ctlr->dev, "DMA timeout\n");
- 			ret = -ETIMEDOUT;
- 		}
- 		if (tx)
--			dmaengine_terminate_all(rspi->master->dma_tx);
-+			dmaengine_terminate_all(rspi->ctlr->dma_tx);
- 		if (rx)
--			dmaengine_terminate_all(rspi->master->dma_rx);
-+			dmaengine_terminate_all(rspi->ctlr->dma_rx);
- 	}
- 
- 	rspi_disable_irq(rspi, irq_mask);
-@@ -614,12 +614,12 @@ static int rspi_dma_transfer(struct rspi_data *rspi, struct sg_table *tx,
- 
- no_dma_tx:
- 	if (rx)
--		dmaengine_terminate_all(rspi->master->dma_rx);
-+		dmaengine_terminate_all(rspi->ctlr->dma_rx);
- no_dma_rx:
- 	if (ret == -EAGAIN) {
- 		pr_warn_once("%s %s: DMA not available, falling back to PIO\n",
--			     dev_driver_string(&rspi->master->dev),
--			     dev_name(&rspi->master->dev));
-+			     dev_driver_string(&rspi->ctlr->dev),
-+			     dev_name(&rspi->ctlr->dev));
- 	}
- 	return ret;
- }
-@@ -660,10 +660,10 @@ static bool __rspi_can_dma(const struct rspi_data *rspi,
- 	return xfer->len > rspi->ops->fifo_size;
- }
- 
--static bool rspi_can_dma(struct spi_master *master, struct spi_device *spi,
-+static bool rspi_can_dma(struct spi_controller *ctlr, struct spi_device *spi,
- 			 struct spi_transfer *xfer)
- {
--	struct rspi_data *rspi = spi_master_get_devdata(master);
-+	struct rspi_data *rspi = spi_controller_get_devdata(ctlr);
- 
- 	return __rspi_can_dma(rspi, xfer);
- }
-@@ -671,7 +671,7 @@ static bool rspi_can_dma(struct spi_master *master, struct spi_device *spi,
- static int rspi_dma_check_then_transfer(struct rspi_data *rspi,
- 					 struct spi_transfer *xfer)
- {
--	if (!rspi->master->can_dma || !__rspi_can_dma(rspi, xfer))
-+	if (!rspi->ctlr->can_dma || !__rspi_can_dma(rspi, xfer))
- 		return -EAGAIN;
- 
- 	/* rx_buf can be NULL on RSPI on SH in TX-only Mode */
-@@ -698,10 +698,10 @@ static int rspi_common_transfer(struct rspi_data *rspi,
- 	return 0;
- }
- 
--static int rspi_transfer_one(struct spi_master *master, struct spi_device *spi,
--			     struct spi_transfer *xfer)
-+static int rspi_transfer_one(struct spi_controller *ctlr,
-+			     struct spi_device *spi, struct spi_transfer *xfer)
- {
--	struct rspi_data *rspi = spi_master_get_devdata(master);
-+	struct rspi_data *rspi = spi_controller_get_devdata(ctlr);
- 	u8 spcr;
- 
- 	spcr = rspi_read8(rspi, RSPI_SPCR);
-@@ -716,11 +716,11 @@ static int rspi_transfer_one(struct spi_master *master, struct spi_device *spi,
- 	return rspi_common_transfer(rspi, xfer);
- }
- 
--static int rspi_rz_transfer_one(struct spi_master *master,
-+static int rspi_rz_transfer_one(struct spi_controller *ctlr,
- 				struct spi_device *spi,
- 				struct spi_transfer *xfer)
- {
--	struct rspi_data *rspi = spi_master_get_devdata(master);
-+	struct rspi_data *rspi = spi_controller_get_devdata(ctlr);
- 
- 	rspi_rz_receive_init(rspi);
- 
-@@ -739,7 +739,7 @@ static int qspi_trigger_transfer_out_in(struct rspi_data *rspi, const u8 *tx,
- 		if (n == QSPI_BUFFER_SIZE) {
- 			ret = rspi_wait_for_tx_empty(rspi);
- 			if (ret < 0) {
--				dev_err(&rspi->master->dev, "transmit timeout\n");
-+				dev_err(&rspi->ctlr->dev, "transmit timeout\n");
- 				return ret;
- 			}
- 			for (i = 0; i < n; i++)
-@@ -747,7 +747,7 @@ static int qspi_trigger_transfer_out_in(struct rspi_data *rspi, const u8 *tx,
- 
- 			ret = rspi_wait_for_rx_full(rspi);
- 			if (ret < 0) {
--				dev_err(&rspi->master->dev, "receive timeout\n");
-+				dev_err(&rspi->ctlr->dev, "receive timeout\n");
- 				return ret;
- 			}
- 			for (i = 0; i < n; i++)
-@@ -785,7 +785,7 @@ static int qspi_transfer_out(struct rspi_data *rspi, struct spi_transfer *xfer)
- 	unsigned int i, len;
- 	int ret;
- 
--	if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) {
-+	if (rspi->ctlr->can_dma && __rspi_can_dma(rspi, xfer)) {
- 		ret = rspi_dma_transfer(rspi, &xfer->tx_sg, NULL);
- 		if (ret != -EAGAIN)
- 			return ret;
-@@ -796,7 +796,7 @@ static int qspi_transfer_out(struct rspi_data *rspi, struct spi_transfer *xfer)
- 		if (len == QSPI_BUFFER_SIZE) {
- 			ret = rspi_wait_for_tx_empty(rspi);
- 			if (ret < 0) {
--				dev_err(&rspi->master->dev, "transmit timeout\n");
-+				dev_err(&rspi->ctlr->dev, "transmit timeout\n");
- 				return ret;
- 			}
- 			for (i = 0; i < len; i++)
-@@ -822,7 +822,7 @@ static int qspi_transfer_in(struct rspi_data *rspi, struct spi_transfer *xfer)
- 	unsigned int i, len;
- 	int ret;
- 
--	if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) {
-+	if (rspi->ctlr->can_dma && __rspi_can_dma(rspi, xfer)) {
- 		int ret = rspi_dma_transfer(rspi, NULL, &xfer->rx_sg);
- 		if (ret != -EAGAIN)
- 			return ret;
-@@ -833,7 +833,7 @@ static int qspi_transfer_in(struct rspi_data *rspi, struct spi_transfer *xfer)
- 		if (len == QSPI_BUFFER_SIZE) {
- 			ret = rspi_wait_for_rx_full(rspi);
- 			if (ret < 0) {
--				dev_err(&rspi->master->dev, "receive timeout\n");
-+				dev_err(&rspi->ctlr->dev, "receive timeout\n");
- 				return ret;
- 			}
- 			for (i = 0; i < len; i++)
-@@ -849,10 +849,10 @@ static int qspi_transfer_in(struct rspi_data *rspi, struct spi_transfer *xfer)
- 	return 0;
- }
- 
--static int qspi_transfer_one(struct spi_master *master, struct spi_device *spi,
--			     struct spi_transfer *xfer)
-+static int qspi_transfer_one(struct spi_controller *ctlr,
-+			     struct spi_device *spi, struct spi_transfer *xfer)
- {
--	struct rspi_data *rspi = spi_master_get_devdata(master);
-+	struct rspi_data *rspi = spi_controller_get_devdata(ctlr);
- 
- 	if (spi->mode & SPI_LOOP) {
- 		return qspi_transfer_out_in(rspi, xfer);
-@@ -870,7 +870,7 @@ static int qspi_transfer_one(struct spi_master *master, struct spi_device *spi,
- 
- static int rspi_setup(struct spi_device *spi)
- {
--	struct rspi_data *rspi = spi_master_get_devdata(spi->master);
-+	struct rspi_data *rspi = spi_controller_get_devdata(spi->controller);
- 
- 	rspi->max_speed_hz = spi->max_speed_hz;
- 
-@@ -955,10 +955,10 @@ static int qspi_setup_sequencer(struct rspi_data *rspi,
- 	return 0;
- }
- 
--static int rspi_prepare_message(struct spi_master *master,
-+static int rspi_prepare_message(struct spi_controller *ctlr,
- 				struct spi_message *msg)
- {
--	struct rspi_data *rspi = spi_master_get_devdata(master);
-+	struct rspi_data *rspi = spi_controller_get_devdata(ctlr);
- 	int ret;
- 
- 	if (msg->spi->mode &
-@@ -974,10 +974,10 @@ static int rspi_prepare_message(struct spi_master *master,
- 	return 0;
- }
- 
--static int rspi_unprepare_message(struct spi_master *master,
-+static int rspi_unprepare_message(struct spi_controller *ctlr,
- 				  struct spi_message *msg)
- {
--	struct rspi_data *rspi = spi_master_get_devdata(master);
-+	struct rspi_data *rspi = spi_controller_get_devdata(ctlr);
- 
- 	/* Disable SPI function */
- 	rspi_write8(rspi, rspi_read8(rspi, RSPI_SPCR) & ~SPCR_SPE, RSPI_SPCR);
-@@ -1081,7 +1081,7 @@ static struct dma_chan *rspi_request_dma_chan(struct device *dev,
- 	return chan;
- }
- 
--static int rspi_request_dma(struct device *dev, struct spi_master *master,
-+static int rspi_request_dma(struct device *dev, struct spi_controller *ctlr,
- 			    const struct resource *res)
- {
- 	const struct rspi_plat_data *rspi_pd = dev_get_platdata(dev);
-@@ -1099,37 +1099,37 @@ static int rspi_request_dma(struct device *dev, struct spi_master *master,
- 		return 0;
- 	}
- 
--	master->dma_tx = rspi_request_dma_chan(dev, DMA_MEM_TO_DEV, dma_tx_id,
--					       res->start + RSPI_SPDR);
--	if (!master->dma_tx)
-+	ctlr->dma_tx = rspi_request_dma_chan(dev, DMA_MEM_TO_DEV, dma_tx_id,
-+					     res->start + RSPI_SPDR);
-+	if (!ctlr->dma_tx)
- 		return -ENODEV;
- 
--	master->dma_rx = rspi_request_dma_chan(dev, DMA_DEV_TO_MEM, dma_rx_id,
--					       res->start + RSPI_SPDR);
--	if (!master->dma_rx) {
--		dma_release_channel(master->dma_tx);
--		master->dma_tx = NULL;
-+	ctlr->dma_rx = rspi_request_dma_chan(dev, DMA_DEV_TO_MEM, dma_rx_id,
-+					     res->start + RSPI_SPDR);
-+	if (!ctlr->dma_rx) {
-+		dma_release_channel(ctlr->dma_tx);
-+		ctlr->dma_tx = NULL;
- 		return -ENODEV;
- 	}
- 
--	master->can_dma = rspi_can_dma;
-+	ctlr->can_dma = rspi_can_dma;
- 	dev_info(dev, "DMA available");
- 	return 0;
- }
- 
--static void rspi_release_dma(struct spi_master *master)
-+static void rspi_release_dma(struct spi_controller *ctlr)
- {
--	if (master->dma_tx)
--		dma_release_channel(master->dma_tx);
--	if (master->dma_rx)
--		dma_release_channel(master->dma_rx);
-+	if (ctlr->dma_tx)
-+		dma_release_channel(ctlr->dma_tx);
-+	if (ctlr->dma_rx)
-+		dma_release_channel(ctlr->dma_rx);
- }
- 
- static int rspi_remove(struct platform_device *pdev)
- {
- 	struct rspi_data *rspi = platform_get_drvdata(pdev);
- 
--	rspi_release_dma(rspi->master);
-+	rspi_release_dma(rspi->ctlr);
- 	pm_runtime_disable(&pdev->dev);
- 
- 	return 0;
-@@ -1139,7 +1139,7 @@ static const struct spi_ops rspi_ops = {
- 	.set_config_register =	rspi_set_config_register,
- 	.transfer_one =		rspi_transfer_one,
- 	.mode_bits =		SPI_CPHA | SPI_CPOL | SPI_LOOP,
--	.flags =		SPI_MASTER_MUST_TX,
-+	.flags =		SPI_CONTROLLER_MUST_TX,
- 	.fifo_size =		8,
- };
- 
-@@ -1147,7 +1147,7 @@ static const struct spi_ops rspi_rz_ops = {
- 	.set_config_register =	rspi_rz_set_config_register,
- 	.transfer_one =		rspi_rz_transfer_one,
- 	.mode_bits =		SPI_CPHA | SPI_CPOL | SPI_LOOP,
--	.flags =		SPI_MASTER_MUST_RX | SPI_MASTER_MUST_TX,
-+	.flags =		SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX,
- 	.fifo_size =		8,	/* 8 for TX, 32 for RX */
- };
- 
-@@ -1157,7 +1157,7 @@ static const struct spi_ops qspi_ops = {
- 	.mode_bits =		SPI_CPHA | SPI_CPOL | SPI_LOOP |
- 				SPI_TX_DUAL | SPI_TX_QUAD |
- 				SPI_RX_DUAL | SPI_RX_QUAD,
--	.flags =		SPI_MASTER_MUST_RX | SPI_MASTER_MUST_TX,
-+	.flags =		SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX,
- 	.fifo_size =		32,
- };
- 
-@@ -1174,7 +1174,7 @@ static const struct of_device_id rspi_of_match[] = {
- 
- MODULE_DEVICE_TABLE(of, rspi_of_match);
- 
--static int rspi_parse_dt(struct device *dev, struct spi_master *master)
-+static int rspi_parse_dt(struct device *dev, struct spi_controller *ctlr)
- {
- 	u32 num_cs;
- 	int error;
-@@ -1186,12 +1186,12 @@ static int rspi_parse_dt(struct device *dev, struct spi_master *master)
- 		return error;
- 	}
- 
--	master->num_chipselect = num_cs;
-+	ctlr->num_chipselect = num_cs;
- 	return 0;
- }
- #else
- #define rspi_of_match	NULL
--static inline int rspi_parse_dt(struct device *dev, struct spi_master *master)
-+static inline int rspi_parse_dt(struct device *dev, struct spi_controller *ctlr)
- {
- 	return -EINVAL;
- }
-@@ -1212,28 +1212,28 @@ static int rspi_request_irq(struct device *dev, unsigned int irq,
- static int rspi_probe(struct platform_device *pdev)
- {
- 	struct resource *res;
--	struct spi_master *master;
-+	struct spi_controller *ctlr;
- 	struct rspi_data *rspi;
- 	int ret;
- 	const struct rspi_plat_data *rspi_pd;
- 	const struct spi_ops *ops;
- 
--	master = spi_alloc_master(&pdev->dev, sizeof(struct rspi_data));
--	if (master == NULL)
-+	ctlr = spi_alloc_master(&pdev->dev, sizeof(struct rspi_data));
-+	if (ctlr == NULL)
- 		return -ENOMEM;
- 
- 	ops = of_device_get_match_data(&pdev->dev);
- 	if (ops) {
--		ret = rspi_parse_dt(&pdev->dev, master);
-+		ret = rspi_parse_dt(&pdev->dev, ctlr);
- 		if (ret)
- 			goto error1;
- 	} else {
- 		ops = (struct spi_ops *)pdev->id_entry->driver_data;
- 		rspi_pd = dev_get_platdata(&pdev->dev);
- 		if (rspi_pd && rspi_pd->num_chipselect)
--			master->num_chipselect = rspi_pd->num_chipselect;
-+			ctlr->num_chipselect = rspi_pd->num_chipselect;
- 		else
--			master->num_chipselect = 2; /* default */
-+			ctlr->num_chipselect = 2; /* default */
- 	}
- 
- 	/* ops parameter check */
-@@ -1243,10 +1243,10 @@ static int rspi_probe(struct platform_device *pdev)
- 		goto error1;
- 	}
- 
--	rspi = spi_master_get_devdata(master);
-+	rspi = spi_controller_get_devdata(ctlr);
- 	platform_set_drvdata(pdev, rspi);
- 	rspi->ops = ops;
--	rspi->master = master;
-+	rspi->ctlr = ctlr;
- 
- 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- 	rspi->addr = devm_ioremap_resource(&pdev->dev, res);
-@@ -1266,15 +1266,15 @@ static int rspi_probe(struct platform_device *pdev)
- 
- 	init_waitqueue_head(&rspi->wait);
- 
--	master->bus_num = pdev->id;
--	master->setup = rspi_setup;
--	master->auto_runtime_pm = true;
--	master->transfer_one = ops->transfer_one;
--	master->prepare_message = rspi_prepare_message;
--	master->unprepare_message = rspi_unprepare_message;
--	master->mode_bits = ops->mode_bits;
--	master->flags = ops->flags;
--	master->dev.of_node = pdev->dev.of_node;
-+	ctlr->bus_num = pdev->id;
-+	ctlr->setup = rspi_setup;
-+	ctlr->auto_runtime_pm = true;
-+	ctlr->transfer_one = ops->transfer_one;
-+	ctlr->prepare_message = rspi_prepare_message;
-+	ctlr->unprepare_message = rspi_unprepare_message;
-+	ctlr->mode_bits = ops->mode_bits;
-+	ctlr->flags = ops->flags;
-+	ctlr->dev.of_node = pdev->dev.of_node;
- 
- 	ret = platform_get_irq_byname(pdev, "rx");
- 	if (ret < 0) {
-@@ -1311,13 +1311,13 @@ static int rspi_probe(struct platform_device *pdev)
- 		goto error2;
- 	}
- 
--	ret = rspi_request_dma(&pdev->dev, master, res);
-+	ret = rspi_request_dma(&pdev->dev, ctlr, res);
- 	if (ret < 0)
- 		dev_warn(&pdev->dev, "DMA not available, using PIO\n");
- 
--	ret = devm_spi_register_master(&pdev->dev, master);
-+	ret = devm_spi_register_controller(&pdev->dev, ctlr);
- 	if (ret < 0) {
--		dev_err(&pdev->dev, "spi_register_master error.\n");
-+		dev_err(&pdev->dev, "devm_spi_register_controller error.\n");
- 		goto error3;
- 	}
- 
-@@ -1326,11 +1326,11 @@ static int rspi_probe(struct platform_device *pdev)
- 	return 0;
- 
- error3:
--	rspi_release_dma(master);
-+	rspi_release_dma(ctlr);
- error2:
- 	pm_runtime_disable(&pdev->dev);
- error1:
--	spi_master_put(master);
-+	spi_controller_put(ctlr);
- 
- 	return ret;
- }
-@@ -1349,14 +1349,14 @@ static int rspi_suspend(struct device *dev)
- {
- 	struct rspi_data *rspi = dev_get_drvdata(dev);
- 
--	return spi_master_suspend(rspi->master);
-+	return spi_controller_suspend(rspi->ctlr);
- }
- 
- static int rspi_resume(struct device *dev)
- {
- 	struct rspi_data *rspi = dev_get_drvdata(dev);
- 
--	return spi_master_resume(rspi->master);
-+	return spi_controller_resume(rspi->ctlr);
- }
- 
- static SIMPLE_DEV_PM_OPS(rspi_pm_ops, rspi_suspend, rspi_resume);
-diff --git a/drivers/spi/spi-sh-hspi.c b/drivers/spi/spi-sh-hspi.c
-index dc0926e43665..7f73f91d412a 100644
---- a/drivers/spi/spi-sh-hspi.c
-+++ b/drivers/spi/spi-sh-hspi.c
-@@ -35,7 +35,7 @@
- 
- struct hspi_priv {
- 	void __iomem *addr;
--	struct spi_master *master;
-+	struct spi_controller *ctlr;
- 	struct device *dev;
- 	struct clk *clk;
- };
-@@ -140,10 +140,10 @@ static void hspi_hw_setup(struct hspi_priv *hspi,
- 	hspi_write(hspi, SPSCR, 0x21);	/* master mode / CS control */
- }
- 
--static int hspi_transfer_one_message(struct spi_master *master,
-+static int hspi_transfer_one_message(struct spi_controller *ctlr,
- 				     struct spi_message *msg)
- {
--	struct hspi_priv *hspi = spi_master_get_devdata(master);
-+	struct hspi_priv *hspi = spi_controller_get_devdata(ctlr);
- 	struct spi_transfer *t;
- 	u32 tx;
- 	u32 rx;
-@@ -205,7 +205,7 @@ static int hspi_transfer_one_message(struct spi_master *master,
- 		ndelay(nsecs);
- 		hspi_hw_cs_disable(hspi);
- 	}
--	spi_finalize_current_message(master);
-+	spi_finalize_current_message(ctlr);
- 
- 	return ret;
- }
-@@ -213,7 +213,7 @@ static int hspi_transfer_one_message(struct spi_master *master,
- static int hspi_probe(struct platform_device *pdev)
- {
- 	struct resource *res;
--	struct spi_master *master;
-+	struct spi_controller *ctlr;
- 	struct hspi_priv *hspi;
- 	struct clk *clk;
- 	int ret;
-@@ -225,11 +225,9 @@ static int hspi_probe(struct platform_device *pdev)
- 		return -EINVAL;
- 	}
- 
--	master = spi_alloc_master(&pdev->dev, sizeof(*hspi));
--	if (!master) {
--		dev_err(&pdev->dev, "spi_alloc_master error.\n");
-+	ctlr = spi_alloc_master(&pdev->dev, sizeof(*hspi));
-+	if (!ctlr)
- 		return -ENOMEM;
--	}
- 
- 	clk = clk_get(&pdev->dev, NULL);
- 	if (IS_ERR(clk)) {
-@@ -238,33 +236,32 @@ static int hspi_probe(struct platform_device *pdev)
- 		goto error0;
- 	}
- 
--	hspi = spi_master_get_devdata(master);
-+	hspi = spi_controller_get_devdata(ctlr);
- 	platform_set_drvdata(pdev, hspi);
- 
- 	/* init hspi */
--	hspi->master	= master;
-+	hspi->ctlr	= ctlr;
- 	hspi->dev	= &pdev->dev;
- 	hspi->clk	= clk;
- 	hspi->addr	= devm_ioremap(hspi->dev,
- 				       res->start, resource_size(res));
- 	if (!hspi->addr) {
--		dev_err(&pdev->dev, "ioremap error.\n");
- 		ret = -ENOMEM;
- 		goto error1;
- 	}
- 
- 	pm_runtime_enable(&pdev->dev);
- 
--	master->bus_num		= pdev->id;
--	master->mode_bits	= SPI_CPOL | SPI_CPHA;
--	master->dev.of_node	= pdev->dev.of_node;
--	master->auto_runtime_pm = true;
--	master->transfer_one_message		= hspi_transfer_one_message;
--	master->bits_per_word_mask = SPI_BPW_MASK(8);
-+	ctlr->bus_num = pdev->id;
-+	ctlr->mode_bits	= SPI_CPOL | SPI_CPHA;
-+	ctlr->dev.of_node = pdev->dev.of_node;
-+	ctlr->auto_runtime_pm = true;
-+	ctlr->transfer_one_message = hspi_transfer_one_message;
-+	ctlr->bits_per_word_mask = SPI_BPW_MASK(8);
- 
--	ret = devm_spi_register_master(&pdev->dev, master);
-+	ret = devm_spi_register_controller(&pdev->dev, ctlr);
- 	if (ret < 0) {
--		dev_err(&pdev->dev, "spi_register_master error.\n");
-+		dev_err(&pdev->dev, "devm_spi_register_controller error.\n");
- 		goto error2;
- 	}
- 
-@@ -275,7 +272,7 @@ static int hspi_probe(struct platform_device *pdev)
-  error1:
- 	clk_put(clk);
-  error0:
--	spi_master_put(master);
-+	spi_controller_put(ctlr);
- 
- 	return ret;
- }
-diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c
-index d14b407cc800..e2eb466db10a 100644
---- a/drivers/spi/spi-sh-msiof.c
-+++ b/drivers/spi/spi-sh-msiof.c
-@@ -1,6 +1,6 @@
- // SPDX-License-Identifier: GPL-2.0
- /*
-- * SuperH MSIOF SPI Master Interface
-+ * SuperH MSIOF SPI Controller Interface
-  *
-  * Copyright (c) 2009 Magnus Damm
-  * Copyright (C) 2014 Renesas Electronics Corporation
-@@ -32,14 +32,15 @@
- #include <asm/unaligned.h>
- 
- struct sh_msiof_chipdata {
-+	u32 bits_per_word_mask;
- 	u16 tx_fifo_size;
- 	u16 rx_fifo_size;
--	u16 master_flags;
-+	u16 ctlr_flags;
- 	u16 min_div_pow;
- };
- 
- struct sh_msiof_spi_priv {
--	struct spi_master *master;
-+	struct spi_controller *ctlr;
- 	void __iomem *mapbase;
- 	struct clk *clk;
- 	struct platform_device *pdev;
-@@ -287,7 +288,7 @@ static void sh_msiof_spi_set_clk_regs(struct sh_msiof_spi_priv *p,
- 
- 	scr = sh_msiof_spi_div_array[div_pow] | SCR_BRPS(brps);
- 	sh_msiof_write(p, TSCR, scr);
--	if (!(p->master->flags & SPI_MASTER_MUST_TX))
-+	if (!(p->ctlr->flags & SPI_CONTROLLER_MUST_TX))
- 		sh_msiof_write(p, RSCR, scr);
- }
- 
-@@ -351,14 +352,14 @@ static void sh_msiof_spi_set_pin_regs(struct sh_msiof_spi_priv *p, u32 ss,
- 	tmp |= !cs_high << MDR1_SYNCAC_SHIFT;
- 	tmp |= lsb_first << MDR1_BITLSB_SHIFT;
- 	tmp |= sh_msiof_spi_get_dtdl_and_syncdl(p);
--	if (spi_controller_is_slave(p->master)) {
-+	if (spi_controller_is_slave(p->ctlr)) {
- 		sh_msiof_write(p, TMDR1, tmp | TMDR1_PCON);
- 	} else {
- 		sh_msiof_write(p, TMDR1,
- 			       tmp | MDR1_TRMD | TMDR1_PCON |
- 			       (ss < MAX_SS ? ss : 0) << TMDR1_SYNCCH_SHIFT);
- 	}
--	if (p->master->flags & SPI_MASTER_MUST_TX) {
-+	if (p->ctlr->flags & SPI_CONTROLLER_MUST_TX) {
- 		/* These bits are reserved if RX needs TX */
- 		tmp &= ~0x0000ffff;
- 	}
-@@ -382,7 +383,7 @@ static void sh_msiof_spi_set_mode_regs(struct sh_msiof_spi_priv *p,
- {
- 	u32 dr2 = MDR2_BITLEN1(bits) | MDR2_WDLEN1(words);
- 
--	if (tx_buf || (p->master->flags & SPI_MASTER_MUST_TX))
-+	if (tx_buf || (p->ctlr->flags & SPI_CONTROLLER_MUST_TX))
- 		sh_msiof_write(p, TMDR2, dr2);
- 	else
- 		sh_msiof_write(p, TMDR2, dr2 | MDR2_GRPMASK1);
-@@ -539,8 +540,9 @@ static void sh_msiof_spi_read_fifo_s32u(struct sh_msiof_spi_priv *p,
- 
- static int sh_msiof_spi_setup(struct spi_device *spi)
- {
--	struct device_node	*np = spi->master->dev.of_node;
--	struct sh_msiof_spi_priv *p = spi_master_get_devdata(spi->master);
-+	struct device_node *np = spi->controller->dev.of_node;
-+	struct sh_msiof_spi_priv *p =
-+		spi_controller_get_devdata(spi->controller);
- 	u32 clr, set, tmp;
- 
- 	if (!np) {
-@@ -556,7 +558,7 @@ static int sh_msiof_spi_setup(struct spi_device *spi)
- 		return 0;
- 	}
- 
--	if (spi_controller_is_slave(p->master))
-+	if (spi_controller_is_slave(p->ctlr))
- 		return 0;
- 
- 	if (p->native_cs_inited &&
-@@ -581,10 +583,10 @@ static int sh_msiof_spi_setup(struct spi_device *spi)
- 	return 0;
- }
- 
--static int sh_msiof_prepare_message(struct spi_master *master,
-+static int sh_msiof_prepare_message(struct spi_controller *ctlr,
- 				    struct spi_message *msg)
- {
--	struct sh_msiof_spi_priv *p = spi_master_get_devdata(master);
-+	struct sh_msiof_spi_priv *p = spi_controller_get_devdata(ctlr);
- 	const struct spi_device *spi = msg->spi;
- 	u32 ss, cs_high;
- 
-@@ -605,7 +607,7 @@ static int sh_msiof_prepare_message(struct spi_master *master,
- 
- static int sh_msiof_spi_start(struct sh_msiof_spi_priv *p, void *rx_buf)
- {
--	bool slave = spi_controller_is_slave(p->master);
-+	bool slave = spi_controller_is_slave(p->ctlr);
- 	int ret = 0;
- 
- 	/* setup clock and rx/tx signals */
-@@ -625,7 +627,7 @@ static int sh_msiof_spi_start(struct sh_msiof_spi_priv *p, void *rx_buf)
- 
- static int sh_msiof_spi_stop(struct sh_msiof_spi_priv *p, void *rx_buf)
- {
--	bool slave = spi_controller_is_slave(p->master);
-+	bool slave = spi_controller_is_slave(p->ctlr);
- 	int ret = 0;
- 
- 	/* shut down frame, rx/tx and clock signals */
-@@ -641,9 +643,9 @@ static int sh_msiof_spi_stop(struct sh_msiof_spi_priv *p, void *rx_buf)
- 	return ret;
- }
- 
--static int sh_msiof_slave_abort(struct spi_master *master)
-+static int sh_msiof_slave_abort(struct spi_controller *ctlr)
- {
--	struct sh_msiof_spi_priv *p = spi_master_get_devdata(master);
-+	struct sh_msiof_spi_priv *p = spi_controller_get_devdata(ctlr);
- 
- 	p->slave_aborted = true;
- 	complete(&p->done);
-@@ -654,7 +656,7 @@ static int sh_msiof_slave_abort(struct spi_master *master)
- static int sh_msiof_wait_for_completion(struct sh_msiof_spi_priv *p,
- 					struct completion *x)
- {
--	if (spi_controller_is_slave(p->master)) {
-+	if (spi_controller_is_slave(p->ctlr)) {
- 		if (wait_for_completion_interruptible(x) ||
- 		    p->slave_aborted) {
- 			dev_dbg(&p->pdev->dev, "interrupted\n");
-@@ -754,7 +756,7 @@ static int sh_msiof_dma_once(struct sh_msiof_spi_priv *p, const void *tx,
- 	/* First prepare and submit the DMA request(s), as this may fail */
- 	if (rx) {
- 		ier_bits |= IER_RDREQE | IER_RDMAE;
--		desc_rx = dmaengine_prep_slave_single(p->master->dma_rx,
-+		desc_rx = dmaengine_prep_slave_single(p->ctlr->dma_rx,
- 					p->rx_dma_addr, len, DMA_DEV_TO_MEM,
- 					DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
- 		if (!desc_rx)
-@@ -769,9 +771,9 @@ static int sh_msiof_dma_once(struct sh_msiof_spi_priv *p, const void *tx,
- 
- 	if (tx) {
- 		ier_bits |= IER_TDREQE | IER_TDMAE;
--		dma_sync_single_for_device(p->master->dma_tx->device->dev,
-+		dma_sync_single_for_device(p->ctlr->dma_tx->device->dev,
- 					   p->tx_dma_addr, len, DMA_TO_DEVICE);
--		desc_tx = dmaengine_prep_slave_single(p->master->dma_tx,
-+		desc_tx = dmaengine_prep_slave_single(p->ctlr->dma_tx,
- 					p->tx_dma_addr, len, DMA_MEM_TO_DEV,
- 					DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
- 		if (!desc_tx) {
-@@ -803,9 +805,9 @@ static int sh_msiof_dma_once(struct sh_msiof_spi_priv *p, const void *tx,
- 
- 	/* Now start DMA */
- 	if (rx)
--		dma_async_issue_pending(p->master->dma_rx);
-+		dma_async_issue_pending(p->ctlr->dma_rx);
- 	if (tx)
--		dma_async_issue_pending(p->master->dma_tx);
-+		dma_async_issue_pending(p->ctlr->dma_tx);
- 
- 	ret = sh_msiof_spi_start(p, rx);
- 	if (ret) {
-@@ -845,9 +847,8 @@ static int sh_msiof_dma_once(struct sh_msiof_spi_priv *p, const void *tx,
- 	}
- 
- 	if (rx)
--		dma_sync_single_for_cpu(p->master->dma_rx->device->dev,
--					p->rx_dma_addr, len,
--					DMA_FROM_DEVICE);
-+		dma_sync_single_for_cpu(p->ctlr->dma_rx->device->dev,
-+					p->rx_dma_addr, len, DMA_FROM_DEVICE);
- 
- 	return 0;
- 
-@@ -856,10 +857,10 @@ static int sh_msiof_dma_once(struct sh_msiof_spi_priv *p, const void *tx,
- 	sh_msiof_spi_stop(p, rx);
- stop_dma:
- 	if (tx)
--		dmaengine_terminate_all(p->master->dma_tx);
-+		dmaengine_terminate_all(p->ctlr->dma_tx);
- no_dma_tx:
- 	if (rx)
--		dmaengine_terminate_all(p->master->dma_rx);
-+		dmaengine_terminate_all(p->ctlr->dma_rx);
- 	sh_msiof_write(p, IER, 0);
- 	return ret;
- }
-@@ -907,11 +908,11 @@ static void copy_plain32(u32 *dst, const u32 *src, unsigned int words)
- 	memcpy(dst, src, words * 4);
- }
- 
--static int sh_msiof_transfer_one(struct spi_master *master,
-+static int sh_msiof_transfer_one(struct spi_controller *ctlr,
- 				 struct spi_device *spi,
- 				 struct spi_transfer *t)
- {
--	struct sh_msiof_spi_priv *p = spi_master_get_devdata(master);
-+	struct sh_msiof_spi_priv *p = spi_controller_get_devdata(ctlr);
- 	void (*copy32)(u32 *, const u32 *, unsigned int);
- 	void (*tx_fifo)(struct sh_msiof_spi_priv *, const void *, int, int);
- 	void (*rx_fifo)(struct sh_msiof_spi_priv *, void *, int, int);
-@@ -926,10 +927,10 @@ static int sh_msiof_transfer_one(struct spi_master *master,
- 	int ret;
- 
- 	/* setup clocks (clock already enabled in chipselect()) */
--	if (!spi_controller_is_slave(p->master))
-+	if (!spi_controller_is_slave(p->ctlr))
- 		sh_msiof_spi_set_clk_regs(p, clk_get_rate(p->clk), t->speed_hz);
- 
--	while (master->dma_tx && len > 15) {
-+	while (ctlr->dma_tx && len > 15) {
- 		/*
- 		 *  DMA supports 32-bit words only, hence pack 8-bit and 16-bit
- 		 *  words, with byte resp. word swapping.
-@@ -937,17 +938,13 @@ static int sh_msiof_transfer_one(struct spi_master *master,
- 		unsigned int l = 0;
- 
- 		if (tx_buf)
--			l = min(len, p->tx_fifo_size * 4);
-+			l = min(round_down(len, 4), p->tx_fifo_size * 4);
- 		if (rx_buf)
--			l = min(len, p->rx_fifo_size * 4);
-+			l = min(round_down(len, 4), p->rx_fifo_size * 4);
- 
- 		if (bits <= 8) {
--			if (l & 3)
--				break;
- 			copy32 = copy_bswap32;
- 		} else if (bits <= 16) {
--			if (l & 3)
--				break;
- 			copy32 = copy_wswap32;
- 		} else {
- 			copy32 = copy_plain32;
-@@ -1052,23 +1049,28 @@ static int sh_msiof_transfer_one(struct spi_master *master,
- }
- 
- static const struct sh_msiof_chipdata sh_data = {
-+	.bits_per_word_mask = SPI_BPW_RANGE_MASK(8, 32),
- 	.tx_fifo_size = 64,
- 	.rx_fifo_size = 64,
--	.master_flags = 0,
-+	.ctlr_flags = 0,
- 	.min_div_pow = 0,
- };
- 
- static const struct sh_msiof_chipdata rcar_gen2_data = {
-+	.bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16) |
-+			      SPI_BPW_MASK(24) | SPI_BPW_MASK(32),
- 	.tx_fifo_size = 64,
- 	.rx_fifo_size = 64,
--	.master_flags = SPI_MASTER_MUST_TX,
-+	.ctlr_flags = SPI_CONTROLLER_MUST_TX,
- 	.min_div_pow = 0,
- };
- 
- static const struct sh_msiof_chipdata rcar_gen3_data = {
-+	.bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16) |
-+			      SPI_BPW_MASK(24) | SPI_BPW_MASK(32),
- 	.tx_fifo_size = 64,
- 	.rx_fifo_size = 64,
--	.master_flags = SPI_MASTER_MUST_TX,
-+	.ctlr_flags = SPI_CONTROLLER_MUST_TX,
- 	.min_div_pow = 1,
- };
- 
-@@ -1136,7 +1138,7 @@ static int sh_msiof_get_cs_gpios(struct sh_msiof_spi_priv *p)
- 	if (ret <= 0)
- 		return 0;
- 
--	num_cs = max_t(unsigned int, ret, p->master->num_chipselect);
-+	num_cs = max_t(unsigned int, ret, p->ctlr->num_chipselect);
- 	for (i = 0; i < num_cs; i++) {
- 		struct gpio_desc *gpiod;
- 
-@@ -1206,10 +1208,10 @@ static int sh_msiof_request_dma(struct sh_msiof_spi_priv *p)
- {
- 	struct platform_device *pdev = p->pdev;
- 	struct device *dev = &pdev->dev;
--	const struct sh_msiof_spi_info *info = dev_get_platdata(dev);
-+	const struct sh_msiof_spi_info *info = p->info;
- 	unsigned int dma_tx_id, dma_rx_id;
- 	const struct resource *res;
--	struct spi_master *master;
-+	struct spi_controller *ctlr;
- 	struct device *tx_dev, *rx_dev;
- 
- 	if (dev->of_node) {
-@@ -1229,17 +1231,15 @@ static int sh_msiof_request_dma(struct sh_msiof_spi_priv *p)
- 	if (!res)
- 		res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- 
--	master = p->master;
--	master->dma_tx = sh_msiof_request_dma_chan(dev, DMA_MEM_TO_DEV,
--						   dma_tx_id,
--						   res->start + TFDR);
--	if (!master->dma_tx)
-+	ctlr = p->ctlr;
-+	ctlr->dma_tx = sh_msiof_request_dma_chan(dev, DMA_MEM_TO_DEV,
-+						 dma_tx_id, res->start + TFDR);
-+	if (!ctlr->dma_tx)
- 		return -ENODEV;
- 
--	master->dma_rx = sh_msiof_request_dma_chan(dev, DMA_DEV_TO_MEM,
--						   dma_rx_id,
--						   res->start + RFDR);
--	if (!master->dma_rx)
-+	ctlr->dma_rx = sh_msiof_request_dma_chan(dev, DMA_DEV_TO_MEM,
-+						 dma_rx_id, res->start + RFDR);
-+	if (!ctlr->dma_rx)
- 		goto free_tx_chan;
- 
- 	p->tx_dma_page = (void *)__get_free_page(GFP_KERNEL | GFP_DMA);
-@@ -1250,13 +1250,13 @@ static int sh_msiof_request_dma(struct sh_msiof_spi_priv *p)
- 	if (!p->rx_dma_page)
- 		goto free_tx_page;
- 
--	tx_dev = master->dma_tx->device->dev;
-+	tx_dev = ctlr->dma_tx->device->dev;
- 	p->tx_dma_addr = dma_map_single(tx_dev, p->tx_dma_page, PAGE_SIZE,
- 					DMA_TO_DEVICE);
- 	if (dma_mapping_error(tx_dev, p->tx_dma_addr))
- 		goto free_rx_page;
- 
--	rx_dev = master->dma_rx->device->dev;
-+	rx_dev = ctlr->dma_rx->device->dev;
- 	p->rx_dma_addr = dma_map_single(rx_dev, p->rx_dma_page, PAGE_SIZE,
- 					DMA_FROM_DEVICE);
- 	if (dma_mapping_error(rx_dev, p->rx_dma_addr))
-@@ -1272,34 +1272,34 @@ static int sh_msiof_request_dma(struct sh_msiof_spi_priv *p)
- free_tx_page:
- 	free_page((unsigned long)p->tx_dma_page);
- free_rx_chan:
--	dma_release_channel(master->dma_rx);
-+	dma_release_channel(ctlr->dma_rx);
- free_tx_chan:
--	dma_release_channel(master->dma_tx);
--	master->dma_tx = NULL;
-+	dma_release_channel(ctlr->dma_tx);
-+	ctlr->dma_tx = NULL;
- 	return -ENODEV;
- }
- 
- static void sh_msiof_release_dma(struct sh_msiof_spi_priv *p)
- {
--	struct spi_master *master = p->master;
-+	struct spi_controller *ctlr = p->ctlr;
- 
--	if (!master->dma_tx)
-+	if (!ctlr->dma_tx)
- 		return;
- 
--	dma_unmap_single(master->dma_rx->device->dev, p->rx_dma_addr,
--			 PAGE_SIZE, DMA_FROM_DEVICE);
--	dma_unmap_single(master->dma_tx->device->dev, p->tx_dma_addr,
--			 PAGE_SIZE, DMA_TO_DEVICE);
-+	dma_unmap_single(ctlr->dma_rx->device->dev, p->rx_dma_addr, PAGE_SIZE,
-+			 DMA_FROM_DEVICE);
-+	dma_unmap_single(ctlr->dma_tx->device->dev, p->tx_dma_addr, PAGE_SIZE,
-+			 DMA_TO_DEVICE);
- 	free_page((unsigned long)p->rx_dma_page);
- 	free_page((unsigned long)p->tx_dma_page);
--	dma_release_channel(master->dma_rx);
--	dma_release_channel(master->dma_tx);
-+	dma_release_channel(ctlr->dma_rx);
-+	dma_release_channel(ctlr->dma_tx);
- }
- 
- static int sh_msiof_spi_probe(struct platform_device *pdev)
- {
- 	struct resource	*r;
--	struct spi_master *master;
-+	struct spi_controller *ctlr;
- 	const struct sh_msiof_chipdata *chipdata;
- 	struct sh_msiof_spi_info *info;
- 	struct sh_msiof_spi_priv *p;
-@@ -1320,18 +1320,18 @@ static int sh_msiof_spi_probe(struct platform_device *pdev)
- 	}
- 
- 	if (info->mode == MSIOF_SPI_SLAVE)
--		master = spi_alloc_slave(&pdev->dev,
--					 sizeof(struct sh_msiof_spi_priv));
-+		ctlr = spi_alloc_slave(&pdev->dev,
-+				       sizeof(struct sh_msiof_spi_priv));
- 	else
--		master = spi_alloc_master(&pdev->dev,
--					  sizeof(struct sh_msiof_spi_priv));
--	if (master == NULL)
-+		ctlr = spi_alloc_master(&pdev->dev,
-+					sizeof(struct sh_msiof_spi_priv));
-+	if (ctlr == NULL)
- 		return -ENOMEM;
- 
--	p = spi_master_get_devdata(master);
-+	p = spi_controller_get_devdata(ctlr);
- 
- 	platform_set_drvdata(pdev, p);
--	p->master = master;
-+	p->ctlr = ctlr;
- 	p->info = info;
- 	p->min_div_pow = chipdata->min_div_pow;
- 
-@@ -1378,31 +1378,31 @@ static int sh_msiof_spi_probe(struct platform_device *pdev)
- 		p->rx_fifo_size = p->info->rx_fifo_override;
- 
- 	/* Setup GPIO chip selects */
--	master->num_chipselect = p->info->num_chipselect;
-+	ctlr->num_chipselect = p->info->num_chipselect;
- 	ret = sh_msiof_get_cs_gpios(p);
- 	if (ret)
- 		goto err1;
- 
--	/* init master code */
--	master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
--	master->mode_bits |= SPI_LSB_FIRST | SPI_3WIRE;
--	master->flags = chipdata->master_flags;
--	master->bus_num = pdev->id;
--	master->dev.of_node = pdev->dev.of_node;
--	master->setup = sh_msiof_spi_setup;
--	master->prepare_message = sh_msiof_prepare_message;
--	master->slave_abort = sh_msiof_slave_abort;
--	master->bits_per_word_mask = SPI_BPW_RANGE_MASK(8, 32);
--	master->auto_runtime_pm = true;
--	master->transfer_one = sh_msiof_transfer_one;
-+	/* init controller code */
-+	ctlr->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
-+	ctlr->mode_bits |= SPI_LSB_FIRST | SPI_3WIRE;
-+	ctlr->flags = chipdata->ctlr_flags;
-+	ctlr->bus_num = pdev->id;
-+	ctlr->dev.of_node = pdev->dev.of_node;
-+	ctlr->setup = sh_msiof_spi_setup;
-+	ctlr->prepare_message = sh_msiof_prepare_message;
-+	ctlr->slave_abort = sh_msiof_slave_abort;
-+	ctlr->bits_per_word_mask = chipdata->bits_per_word_mask;
-+	ctlr->auto_runtime_pm = true;
-+	ctlr->transfer_one = sh_msiof_transfer_one;
- 
- 	ret = sh_msiof_request_dma(p);
- 	if (ret < 0)
- 		dev_warn(&pdev->dev, "DMA not available, using PIO\n");
- 
--	ret = devm_spi_register_master(&pdev->dev, master);
-+	ret = devm_spi_register_controller(&pdev->dev, ctlr);
- 	if (ret < 0) {
--		dev_err(&pdev->dev, "spi_register_master error.\n");
-+		dev_err(&pdev->dev, "devm_spi_register_controller error.\n");
- 		goto err2;
- 	}
- 
-@@ -1412,7 +1412,7 @@ static int sh_msiof_spi_probe(struct platform_device *pdev)
- 	sh_msiof_release_dma(p);
- 	pm_runtime_disable(&pdev->dev);
-  err1:
--	spi_master_put(master);
-+	spi_controller_put(ctlr);
- 	return ret;
- }
- 
-@@ -1436,14 +1436,14 @@ static int sh_msiof_spi_suspend(struct device *dev)
- {
- 	struct sh_msiof_spi_priv *p = dev_get_drvdata(dev);
- 
--	return spi_master_suspend(p->master);
-+	return spi_controller_suspend(p->ctlr);
- }
- 
- static int sh_msiof_spi_resume(struct device *dev)
- {
- 	struct sh_msiof_spi_priv *p = dev_get_drvdata(dev);
- 
--	return spi_master_resume(p->master);
-+	return spi_controller_resume(p->ctlr);
- }
- 
- static SIMPLE_DEV_PM_OPS(sh_msiof_spi_pm_ops, sh_msiof_spi_suspend,
-@@ -1465,7 +1465,7 @@ static struct platform_driver sh_msiof_spi_drv = {
- };
- module_platform_driver(sh_msiof_spi_drv);
- 
--MODULE_DESCRIPTION("SuperH MSIOF SPI Master Interface Driver");
-+MODULE_DESCRIPTION("SuperH MSIOF SPI Controller Interface Driver");
- MODULE_AUTHOR("Magnus Damm");
- MODULE_LICENSE("GPL v2");
- MODULE_ALIAS("platform:spi_sh_msiof");
-diff --git a/drivers/spi/spi-sifive.c b/drivers/spi/spi-sifive.c
-new file mode 100644
-index 000000000000..93ec2c6cdbfd
---- /dev/null
-+++ b/drivers/spi/spi-sifive.c
-@@ -0,0 +1,448 @@
-+// SPDX-License-Identifier: GPL-2.0
-+//
-+// Copyright 2018 SiFive, Inc.
-+//
-+// SiFive SPI controller driver (master mode only)
-+//
-+// Author: SiFive, Inc.
-+// sifive@sifive.com
-+
-+#include <linux/clk.h>
-+#include <linux/module.h>
-+#include <linux/interrupt.h>
-+#include <linux/of.h>
-+#include <linux/platform_device.h>
-+#include <linux/spi/spi.h>
-+#include <linux/io.h>
-+#include <linux/log2.h>
-+
-+#define SIFIVE_SPI_DRIVER_NAME           "sifive_spi"
-+
-+#define SIFIVE_SPI_MAX_CS                32
-+#define SIFIVE_SPI_DEFAULT_DEPTH         8
-+#define SIFIVE_SPI_DEFAULT_MAX_BITS      8
-+
-+/* register offsets */
-+#define SIFIVE_SPI_REG_SCKDIV            0x00 /* Serial clock divisor */
-+#define SIFIVE_SPI_REG_SCKMODE           0x04 /* Serial clock mode */
-+#define SIFIVE_SPI_REG_CSID              0x10 /* Chip select ID */
-+#define SIFIVE_SPI_REG_CSDEF             0x14 /* Chip select default */
-+#define SIFIVE_SPI_REG_CSMODE            0x18 /* Chip select mode */
-+#define SIFIVE_SPI_REG_DELAY0            0x28 /* Delay control 0 */
-+#define SIFIVE_SPI_REG_DELAY1            0x2c /* Delay control 1 */
-+#define SIFIVE_SPI_REG_FMT               0x40 /* Frame format */
-+#define SIFIVE_SPI_REG_TXDATA            0x48 /* Tx FIFO data */
-+#define SIFIVE_SPI_REG_RXDATA            0x4c /* Rx FIFO data */
-+#define SIFIVE_SPI_REG_TXMARK            0x50 /* Tx FIFO watermark */
-+#define SIFIVE_SPI_REG_RXMARK            0x54 /* Rx FIFO watermark */
-+#define SIFIVE_SPI_REG_FCTRL             0x60 /* SPI flash interface control */
-+#define SIFIVE_SPI_REG_FFMT              0x64 /* SPI flash instruction format */
-+#define SIFIVE_SPI_REG_IE                0x70 /* Interrupt Enable Register */
-+#define SIFIVE_SPI_REG_IP                0x74 /* Interrupt Pendings Register */
-+
-+/* sckdiv bits */
-+#define SIFIVE_SPI_SCKDIV_DIV_MASK       0xfffU
-+
-+/* sckmode bits */
-+#define SIFIVE_SPI_SCKMODE_PHA           BIT(0)
-+#define SIFIVE_SPI_SCKMODE_POL           BIT(1)
-+#define SIFIVE_SPI_SCKMODE_MODE_MASK     (SIFIVE_SPI_SCKMODE_PHA | \
-+					  SIFIVE_SPI_SCKMODE_POL)
-+
-+/* csmode bits */
-+#define SIFIVE_SPI_CSMODE_MODE_AUTO      0U
-+#define SIFIVE_SPI_CSMODE_MODE_HOLD      2U
-+#define SIFIVE_SPI_CSMODE_MODE_OFF       3U
-+
-+/* delay0 bits */
-+#define SIFIVE_SPI_DELAY0_CSSCK(x)       ((u32)(x))
-+#define SIFIVE_SPI_DELAY0_CSSCK_MASK     0xffU
-+#define SIFIVE_SPI_DELAY0_SCKCS(x)       ((u32)(x) << 16)
-+#define SIFIVE_SPI_DELAY0_SCKCS_MASK     (0xffU << 16)
-+
-+/* delay1 bits */
-+#define SIFIVE_SPI_DELAY1_INTERCS(x)     ((u32)(x))
-+#define SIFIVE_SPI_DELAY1_INTERCS_MASK   0xffU
-+#define SIFIVE_SPI_DELAY1_INTERXFR(x)    ((u32)(x) << 16)
-+#define SIFIVE_SPI_DELAY1_INTERXFR_MASK  (0xffU << 16)
-+
-+/* fmt bits */
-+#define SIFIVE_SPI_FMT_PROTO_SINGLE      0U
-+#define SIFIVE_SPI_FMT_PROTO_DUAL        1U
-+#define SIFIVE_SPI_FMT_PROTO_QUAD        2U
-+#define SIFIVE_SPI_FMT_PROTO_MASK        3U
-+#define SIFIVE_SPI_FMT_ENDIAN            BIT(2)
-+#define SIFIVE_SPI_FMT_DIR               BIT(3)
-+#define SIFIVE_SPI_FMT_LEN(x)            ((u32)(x) << 16)
-+#define SIFIVE_SPI_FMT_LEN_MASK          (0xfU << 16)
-+
-+/* txdata bits */
-+#define SIFIVE_SPI_TXDATA_DATA_MASK      0xffU
-+#define SIFIVE_SPI_TXDATA_FULL           BIT(31)
-+
-+/* rxdata bits */
-+#define SIFIVE_SPI_RXDATA_DATA_MASK      0xffU
-+#define SIFIVE_SPI_RXDATA_EMPTY          BIT(31)
-+
-+/* ie and ip bits */
-+#define SIFIVE_SPI_IP_TXWM               BIT(0)
-+#define SIFIVE_SPI_IP_RXWM               BIT(1)
-+
-+struct sifive_spi {
-+	void __iomem      *regs;        /* virt. address of control registers */
-+	struct clk        *clk;         /* bus clock */
-+	unsigned int      fifo_depth;   /* fifo depth in words */
-+	u32               cs_inactive;  /* level of the CS pins when inactive */
-+	struct completion done;         /* wake-up from interrupt */
-+};
-+
-+static void sifive_spi_write(struct sifive_spi *spi, int offset, u32 value)
-+{
-+	iowrite32(value, spi->regs + offset);
-+}
-+
-+static u32 sifive_spi_read(struct sifive_spi *spi, int offset)
-+{
-+	return ioread32(spi->regs + offset);
-+}
-+
-+static void sifive_spi_init(struct sifive_spi *spi)
-+{
-+	/* Watermark interrupts are disabled by default */
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_IE, 0);
-+
-+	/* Default watermark FIFO threshold values */
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_TXMARK, 1);
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_RXMARK, 0);
-+
-+	/* Set CS/SCK Delays and Inactive Time to defaults */
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_DELAY0,
-+			 SIFIVE_SPI_DELAY0_CSSCK(1) |
-+			 SIFIVE_SPI_DELAY0_SCKCS(1));
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_DELAY1,
-+			 SIFIVE_SPI_DELAY1_INTERCS(1) |
-+			 SIFIVE_SPI_DELAY1_INTERXFR(0));
-+
-+	/* Exit specialized memory-mapped SPI flash mode */
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_FCTRL, 0);
-+}
-+
-+static int
-+sifive_spi_prepare_message(struct spi_master *master, struct spi_message *msg)
-+{
-+	struct sifive_spi *spi = spi_master_get_devdata(master);
-+	struct spi_device *device = msg->spi;
-+
-+	/* Update the chip select polarity */
-+	if (device->mode & SPI_CS_HIGH)
-+		spi->cs_inactive &= ~BIT(device->chip_select);
-+	else
-+		spi->cs_inactive |= BIT(device->chip_select);
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_CSDEF, spi->cs_inactive);
-+
-+	/* Select the correct device */
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_CSID, device->chip_select);
-+
-+	/* Set clock mode */
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_SCKMODE,
-+			 device->mode & SIFIVE_SPI_SCKMODE_MODE_MASK);
-+
-+	return 0;
-+}
-+
-+static void sifive_spi_set_cs(struct spi_device *device, bool is_high)
-+{
-+	struct sifive_spi *spi = spi_master_get_devdata(device->master);
-+
-+	/* Reverse polarity is handled by SCMR/CPOL. Not inverted CS. */
-+	if (device->mode & SPI_CS_HIGH)
-+		is_high = !is_high;
-+
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_CSMODE, is_high ?
-+			 SIFIVE_SPI_CSMODE_MODE_AUTO :
-+			 SIFIVE_SPI_CSMODE_MODE_HOLD);
-+}
-+
-+static int
-+sifive_spi_prep_transfer(struct sifive_spi *spi, struct spi_device *device,
-+			 struct spi_transfer *t)
-+{
-+	u32 cr;
-+	unsigned int mode;
-+
-+	/* Calculate and program the clock rate */
-+	cr = DIV_ROUND_UP(clk_get_rate(spi->clk) >> 1, t->speed_hz) - 1;
-+	cr &= SIFIVE_SPI_SCKDIV_DIV_MASK;
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_SCKDIV, cr);
-+
-+	mode = max_t(unsigned int, t->rx_nbits, t->tx_nbits);
-+
-+	/* Set frame format */
-+	cr = SIFIVE_SPI_FMT_LEN(t->bits_per_word);
-+	switch (mode) {
-+	case SPI_NBITS_QUAD:
-+		cr |= SIFIVE_SPI_FMT_PROTO_QUAD;
-+		break;
-+	case SPI_NBITS_DUAL:
-+		cr |= SIFIVE_SPI_FMT_PROTO_DUAL;
-+		break;
-+	default:
-+		cr |= SIFIVE_SPI_FMT_PROTO_SINGLE;
-+		break;
-+	}
-+	if (device->mode & SPI_LSB_FIRST)
-+		cr |= SIFIVE_SPI_FMT_ENDIAN;
-+	if (!t->rx_buf)
-+		cr |= SIFIVE_SPI_FMT_DIR;
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_FMT, cr);
-+
-+	/* We will want to poll if the time we need to wait is
-+	 * less than the context switching time.
-+	 * Let's call that threshold 5us. The operation will take:
-+	 *    (8/mode) * fifo_depth / hz <= 5 * 10^-6
-+	 *    1600000 * fifo_depth <= hz * mode
-+	 */
-+	return 1600000 * spi->fifo_depth <= t->speed_hz * mode;
-+}
-+
-+static irqreturn_t sifive_spi_irq(int irq, void *dev_id)
-+{
-+	struct sifive_spi *spi = dev_id;
-+	u32 ip = sifive_spi_read(spi, SIFIVE_SPI_REG_IP);
-+
-+	if (ip & (SIFIVE_SPI_IP_TXWM | SIFIVE_SPI_IP_RXWM)) {
-+		/* Disable interrupts until next transfer */
-+		sifive_spi_write(spi, SIFIVE_SPI_REG_IE, 0);
-+		complete(&spi->done);
-+		return IRQ_HANDLED;
-+	}
-+
-+	return IRQ_NONE;
-+}
-+
-+static void sifive_spi_wait(struct sifive_spi *spi, u32 bit, int poll)
-+{
-+	if (poll) {
-+		u32 cr;
-+
-+		do {
-+			cr = sifive_spi_read(spi, SIFIVE_SPI_REG_IP);
-+		} while (!(cr & bit));
-+	} else {
-+		reinit_completion(&spi->done);
-+		sifive_spi_write(spi, SIFIVE_SPI_REG_IE, bit);
-+		wait_for_completion(&spi->done);
-+	}
-+}
-+
-+static void sifive_spi_tx(struct sifive_spi *spi, const u8 *tx_ptr)
-+{
-+	WARN_ON_ONCE((sifive_spi_read(spi, SIFIVE_SPI_REG_TXDATA)
-+				& SIFIVE_SPI_TXDATA_FULL) != 0);
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_TXDATA,
-+			 *tx_ptr & SIFIVE_SPI_TXDATA_DATA_MASK);
-+}
-+
-+static void sifive_spi_rx(struct sifive_spi *spi, u8 *rx_ptr)
-+{
-+	u32 data = sifive_spi_read(spi, SIFIVE_SPI_REG_RXDATA);
-+
-+	WARN_ON_ONCE((data & SIFIVE_SPI_RXDATA_EMPTY) != 0);
-+	*rx_ptr = data & SIFIVE_SPI_RXDATA_DATA_MASK;
-+}
-+
-+static int
-+sifive_spi_transfer_one(struct spi_master *master, struct spi_device *device,
-+			struct spi_transfer *t)
-+{
-+	struct sifive_spi *spi = spi_master_get_devdata(master);
-+	int poll = sifive_spi_prep_transfer(spi, device, t);
-+	const u8 *tx_ptr = t->tx_buf;
-+	u8 *rx_ptr = t->rx_buf;
-+	unsigned int remaining_words = t->len;
-+
-+	while (remaining_words) {
-+		unsigned int n_words = min(remaining_words, spi->fifo_depth);
-+		unsigned int i;
-+
-+		/* Enqueue n_words for transmission */
-+		for (i = 0; i < n_words; i++)
-+			sifive_spi_tx(spi, tx_ptr++);
-+
-+		if (rx_ptr) {
-+			/* Wait for transmission + reception to complete */
-+			sifive_spi_write(spi, SIFIVE_SPI_REG_RXMARK,
-+					 n_words - 1);
-+			sifive_spi_wait(spi, SIFIVE_SPI_IP_RXWM, poll);
-+
-+			/* Read out all the data from the RX FIFO */
-+			for (i = 0; i < n_words; i++)
-+				sifive_spi_rx(spi, rx_ptr++);
-+		} else {
-+			/* Wait for transmission to complete */
-+			sifive_spi_wait(spi, SIFIVE_SPI_IP_TXWM, poll);
-+		}
-+
-+		remaining_words -= n_words;
-+	}
-+
-+	return 0;
-+}
-+
-+static int sifive_spi_probe(struct platform_device *pdev)
-+{
-+	struct sifive_spi *spi;
-+	struct resource *res;
-+	int ret, irq, num_cs;
-+	u32 cs_bits, max_bits_per_word;
-+	struct spi_master *master;
-+
-+	master = spi_alloc_master(&pdev->dev, sizeof(struct sifive_spi));
-+	if (!master) {
-+		dev_err(&pdev->dev, "out of memory\n");
-+		return -ENOMEM;
-+	}
-+
-+	spi = spi_master_get_devdata(master);
-+	init_completion(&spi->done);
-+	platform_set_drvdata(pdev, master);
-+
-+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+	spi->regs = devm_ioremap_resource(&pdev->dev, res);
-+	if (IS_ERR(spi->regs)) {
-+		ret = PTR_ERR(spi->regs);
-+		goto put_master;
-+	}
-+
-+	spi->clk = devm_clk_get(&pdev->dev, NULL);
-+	if (IS_ERR(spi->clk)) {
-+		dev_err(&pdev->dev, "Unable to find bus clock\n");
-+		ret = PTR_ERR(spi->clk);
-+		goto put_master;
-+	}
-+
-+	irq = platform_get_irq(pdev, 0);
-+	if (irq < 0) {
-+		dev_err(&pdev->dev, "Unable to find interrupt\n");
-+		ret = irq;
-+		goto put_master;
-+	}
-+
-+	/* Optional parameters */
-+	ret =
-+	  of_property_read_u32(pdev->dev.of_node, "sifive,fifo-depth",
-+			       &spi->fifo_depth);
-+	if (ret < 0)
-+		spi->fifo_depth = SIFIVE_SPI_DEFAULT_DEPTH;
-+
-+	ret =
-+	  of_property_read_u32(pdev->dev.of_node, "sifive,max-bits-per-word",
-+			       &max_bits_per_word);
-+
-+	if (!ret && max_bits_per_word < 8) {
-+		dev_err(&pdev->dev, "Only 8bit SPI words supported by the driver\n");
-+		ret = -EINVAL;
-+		goto put_master;
-+	}
-+
-+	/* Spin up the bus clock before hitting registers */
-+	ret = clk_prepare_enable(spi->clk);
-+	if (ret) {
-+		dev_err(&pdev->dev, "Unable to enable bus clock\n");
-+		goto put_master;
-+	}
-+
-+	/* probe the number of CS lines */
-+	spi->cs_inactive = sifive_spi_read(spi, SIFIVE_SPI_REG_CSDEF);
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_CSDEF, 0xffffffffU);
-+	cs_bits = sifive_spi_read(spi, SIFIVE_SPI_REG_CSDEF);
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_CSDEF, spi->cs_inactive);
-+	if (!cs_bits) {
-+		dev_err(&pdev->dev, "Could not auto probe CS lines\n");
-+		ret = -EINVAL;
-+		goto put_master;
-+	}
-+
-+	num_cs = ilog2(cs_bits) + 1;
-+	if (num_cs > SIFIVE_SPI_MAX_CS) {
-+		dev_err(&pdev->dev, "Invalid number of spi slaves\n");
-+		ret = -EINVAL;
-+		goto put_master;
-+	}
-+
-+	/* Define our master */
-+	master->dev.of_node = pdev->dev.of_node;
-+	master->bus_num = pdev->id;
-+	master->num_chipselect = num_cs;
-+	master->mode_bits = SPI_CPHA | SPI_CPOL
-+			  | SPI_CS_HIGH | SPI_LSB_FIRST
-+			  | SPI_TX_DUAL | SPI_TX_QUAD
-+			  | SPI_RX_DUAL | SPI_RX_QUAD;
-+	/* TODO: add driver support for bits_per_word < 8
-+	 * we need to "left-align" the bits (unless SPI_LSB_FIRST)
-+	 */
-+	master->bits_per_word_mask = SPI_BPW_MASK(8);
-+	master->flags = SPI_CONTROLLER_MUST_TX | SPI_MASTER_GPIO_SS;
-+	master->prepare_message = sifive_spi_prepare_message;
-+	master->set_cs = sifive_spi_set_cs;
-+	master->transfer_one = sifive_spi_transfer_one;
-+
-+	pdev->dev.dma_mask = NULL;
-+	/* Configure the SPI master hardware */
-+	sifive_spi_init(spi);
-+
-+	/* Register for SPI Interrupt */
-+	ret = devm_request_irq(&pdev->dev, irq, sifive_spi_irq, 0,
-+			       dev_name(&pdev->dev), spi);
-+	if (ret) {
-+		dev_err(&pdev->dev, "Unable to bind to interrupt\n");
-+		goto put_master;
-+	}
-+
-+	dev_info(&pdev->dev, "mapped; irq=%d, cs=%d\n",
-+		 irq, master->num_chipselect);
-+
-+	ret = devm_spi_register_master(&pdev->dev, master);
-+	if (ret < 0) {
-+		dev_err(&pdev->dev, "spi_register_master failed\n");
-+		goto put_master;
-+	}
-+
-+	return 0;
-+
-+put_master:
-+	spi_master_put(master);
-+
-+	return ret;
-+}
-+
-+static int sifive_spi_remove(struct platform_device *pdev)
-+{
-+	struct spi_master *master = platform_get_drvdata(pdev);
-+	struct sifive_spi *spi = spi_master_get_devdata(master);
-+
-+	/* Disable all the interrupts just in case */
-+	sifive_spi_write(spi, SIFIVE_SPI_REG_IE, 0);
-+
-+	return 0;
-+}
-+
-+static const struct of_device_id sifive_spi_of_match[] = {
-+	{ .compatible = "sifive,spi0", },
-+	{}
-+};
-+MODULE_DEVICE_TABLE(of, sifive_spi_of_match);
-+
-+static struct platform_driver sifive_spi_driver = {
-+	.probe = sifive_spi_probe,
-+	.remove = sifive_spi_remove,
-+	.driver = {
-+		.name = SIFIVE_SPI_DRIVER_NAME,
-+		.of_match_table = sifive_spi_of_match,
-+	},
-+};
-+module_platform_driver(sifive_spi_driver);
-+
-+MODULE_AUTHOR("SiFive, Inc. <sifive@sifive.com>");
-+MODULE_DESCRIPTION("SiFive SPI driver");
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/spi/spi-sprd.c b/drivers/spi/spi-sprd.c
-index 8daa24eec624..1b7eebb72c07 100644
---- a/drivers/spi/spi-sprd.c
-+++ b/drivers/spi/spi-sprd.c
-@@ -2,6 +2,9 @@
- // Copyright (C) 2018 Spreadtrum Communications Inc.
- 
- #include <linux/clk.h>
-+#include <linux/dmaengine.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/dma/sprd-dma.h>
- #include <linux/interrupt.h>
- #include <linux/io.h>
- #include <linux/iopoll.h>
-@@ -9,6 +12,7 @@
- #include <linux/module.h>
- #include <linux/of.h>
- #include <linux/of_device.h>
-+#include <linux/of_dma.h>
- #include <linux/platform_device.h>
- #include <linux/pm_runtime.h>
- #include <linux/spi/spi.h>
-@@ -128,11 +132,28 @@
- #define SPRD_SPI_DEFAULT_SOURCE		26000000
- #define SPRD_SPI_MAX_SPEED_HZ		48000000
- #define SPRD_SPI_AUTOSUSPEND_DELAY	100
-+#define SPRD_SPI_DMA_STEP		8
-+
-+enum sprd_spi_dma_channel {
-+	SPRD_SPI_RX,
-+	SPRD_SPI_TX,
-+	SPRD_SPI_MAX,
-+};
-+
-+struct sprd_spi_dma {
-+	bool enable;
-+	struct dma_chan *dma_chan[SPRD_SPI_MAX];
-+	enum dma_slave_buswidth width;
-+	u32 fragmens_len;
-+	u32 rx_len;
-+};
- 
- struct sprd_spi {
- 	void __iomem *base;
-+	phys_addr_t phy_base;
- 	struct device *dev;
- 	struct clk *clk;
-+	int irq;
- 	u32 src_clk;
- 	u32 hw_mode;
- 	u32 trans_len;
-@@ -141,6 +162,8 @@ struct sprd_spi {
- 	u32 hw_speed_hz;
- 	u32 len;
- 	int status;
-+	struct sprd_spi_dma dma;
-+	struct completion xfer_completion;
- 	const void *tx_buf;
- 	void *rx_buf;
- 	int (*read_bufs)(struct sprd_spi *ss, u32 len);
-@@ -380,7 +403,7 @@ static int sprd_spi_txrx_bufs(struct spi_device *sdev, struct spi_transfer *t)
- {
- 	struct sprd_spi *ss = spi_controller_get_devdata(sdev->controller);
- 	u32 trans_len = ss->trans_len, len;
--	int ret, write_size = 0;
-+	int ret, write_size = 0, read_size = 0;
- 
- 	while (trans_len) {
- 		len = trans_len > SPRD_SPI_FIFO_SIZE ? SPRD_SPI_FIFO_SIZE :
-@@ -416,19 +439,223 @@ static int sprd_spi_txrx_bufs(struct spi_device *sdev, struct spi_transfer *t)
- 			goto complete;
- 
- 		if (ss->trans_mode & SPRD_SPI_RX_MODE)
--			ss->read_bufs(ss, len);
-+			read_size += ss->read_bufs(ss, len);
- 
- 		trans_len -= len;
- 	}
- 
--	ret = write_size;
--
-+	if (ss->trans_mode & SPRD_SPI_TX_MODE)
-+		ret = write_size;
-+	else
-+		ret = read_size;
- complete:
- 	sprd_spi_enter_idle(ss);
- 
- 	return ret;
- }
- 
-+static void sprd_spi_irq_enable(struct sprd_spi *ss)
-+{
-+	u32 val;
-+
-+	/* Clear interrupt status before enabling interrupt. */
-+	writel_relaxed(SPRD_SPI_TX_END_CLR | SPRD_SPI_RX_END_CLR,
-+		ss->base + SPRD_SPI_INT_CLR);
-+	/* Enable SPI interrupt only in DMA mode. */
-+	val = readl_relaxed(ss->base + SPRD_SPI_INT_EN);
-+	writel_relaxed(val | SPRD_SPI_TX_END_INT_EN |
-+		       SPRD_SPI_RX_END_INT_EN,
-+		       ss->base + SPRD_SPI_INT_EN);
-+}
-+
-+static void sprd_spi_irq_disable(struct sprd_spi *ss)
-+{
-+	writel_relaxed(0, ss->base + SPRD_SPI_INT_EN);
-+}
-+
-+static void sprd_spi_dma_enable(struct sprd_spi *ss, bool enable)
-+{
-+	u32 val = readl_relaxed(ss->base + SPRD_SPI_CTL2);
-+
-+	if (enable)
-+		val |= SPRD_SPI_DMA_EN;
-+	else
-+		val &= ~SPRD_SPI_DMA_EN;
-+
-+	writel_relaxed(val, ss->base + SPRD_SPI_CTL2);
-+}
-+
-+static int sprd_spi_dma_submit(struct dma_chan *dma_chan,
-+			       struct dma_slave_config *c,
-+			       struct sg_table *sg,
-+			       enum dma_transfer_direction dir)
-+{
-+	struct dma_async_tx_descriptor *desc;
-+	dma_cookie_t cookie;
-+	unsigned long flags;
-+	int ret;
-+
-+	ret = dmaengine_slave_config(dma_chan, c);
-+	if (ret < 0)
-+		return ret;
-+
-+	flags = SPRD_DMA_FLAGS(SPRD_DMA_CHN_MODE_NONE, SPRD_DMA_NO_TRG,
-+			       SPRD_DMA_FRAG_REQ, SPRD_DMA_TRANS_INT);
-+	desc = dmaengine_prep_slave_sg(dma_chan, sg->sgl, sg->nents, dir, flags);
-+	if (!desc)
-+		return  -ENODEV;
-+
-+	cookie = dmaengine_submit(desc);
-+	if (dma_submit_error(cookie))
-+		return dma_submit_error(cookie);
-+
-+	dma_async_issue_pending(dma_chan);
-+
-+	return 0;
-+}
-+
-+static int sprd_spi_dma_rx_config(struct sprd_spi *ss, struct spi_transfer *t)
-+{
-+	struct dma_chan *dma_chan = ss->dma.dma_chan[SPRD_SPI_RX];
-+	struct dma_slave_config config = {
-+		.src_addr = ss->phy_base,
-+		.src_addr_width = ss->dma.width,
-+		.dst_addr_width = ss->dma.width,
-+		.dst_maxburst = ss->dma.fragmens_len,
-+	};
-+	int ret;
-+
-+	ret = sprd_spi_dma_submit(dma_chan, &config, &t->rx_sg, DMA_DEV_TO_MEM);
-+	if (ret)
-+		return ret;
-+
-+	return ss->dma.rx_len;
-+}
-+
-+static int sprd_spi_dma_tx_config(struct sprd_spi *ss, struct spi_transfer *t)
-+{
-+	struct dma_chan *dma_chan = ss->dma.dma_chan[SPRD_SPI_TX];
-+	struct dma_slave_config config = {
-+		.dst_addr = ss->phy_base,
-+		.src_addr_width = ss->dma.width,
-+		.dst_addr_width = ss->dma.width,
-+		.src_maxburst = ss->dma.fragmens_len,
-+	};
-+	int ret;
-+
-+	ret = sprd_spi_dma_submit(dma_chan, &config, &t->tx_sg, DMA_MEM_TO_DEV);
-+	if (ret)
-+		return ret;
-+
-+	return t->len;
-+}
-+
-+static int sprd_spi_dma_request(struct sprd_spi *ss)
-+{
-+	ss->dma.dma_chan[SPRD_SPI_RX] = dma_request_chan(ss->dev, "rx_chn");
-+	if (IS_ERR_OR_NULL(ss->dma.dma_chan[SPRD_SPI_RX])) {
-+		if (PTR_ERR(ss->dma.dma_chan[SPRD_SPI_RX]) == -EPROBE_DEFER)
-+			return PTR_ERR(ss->dma.dma_chan[SPRD_SPI_RX]);
-+
-+		dev_err(ss->dev, "request RX DMA channel failed!\n");
-+		return PTR_ERR(ss->dma.dma_chan[SPRD_SPI_RX]);
-+	}
-+
-+	ss->dma.dma_chan[SPRD_SPI_TX]  = dma_request_chan(ss->dev, "tx_chn");
-+	if (IS_ERR_OR_NULL(ss->dma.dma_chan[SPRD_SPI_TX])) {
-+		if (PTR_ERR(ss->dma.dma_chan[SPRD_SPI_TX]) == -EPROBE_DEFER)
-+			return PTR_ERR(ss->dma.dma_chan[SPRD_SPI_TX]);
-+
-+		dev_err(ss->dev, "request TX DMA channel failed!\n");
-+		dma_release_channel(ss->dma.dma_chan[SPRD_SPI_RX]);
-+		return PTR_ERR(ss->dma.dma_chan[SPRD_SPI_TX]);
-+	}
-+
-+	return 0;
-+}
-+
-+static void sprd_spi_dma_release(struct sprd_spi *ss)
-+{
-+	if (ss->dma.dma_chan[SPRD_SPI_RX])
-+		dma_release_channel(ss->dma.dma_chan[SPRD_SPI_RX]);
-+
-+	if (ss->dma.dma_chan[SPRD_SPI_TX])
-+		dma_release_channel(ss->dma.dma_chan[SPRD_SPI_TX]);
-+}
-+
-+static int sprd_spi_dma_txrx_bufs(struct spi_device *sdev,
-+				  struct spi_transfer *t)
-+{
-+	struct sprd_spi *ss = spi_master_get_devdata(sdev->master);
-+	u32 trans_len = ss->trans_len;
-+	int ret, write_size = 0;
-+
-+	reinit_completion(&ss->xfer_completion);
-+	sprd_spi_irq_enable(ss);
-+	if (ss->trans_mode & SPRD_SPI_TX_MODE) {
-+		write_size = sprd_spi_dma_tx_config(ss, t);
-+		sprd_spi_set_tx_length(ss, trans_len);
-+
-+		/*
-+		 * For our 3 wires mode or dual TX line mode, we need
-+		 * to request the controller to transfer.
-+		 */
-+		if (ss->hw_mode & SPI_3WIRE || ss->hw_mode & SPI_TX_DUAL)
-+			sprd_spi_tx_req(ss);
-+	} else {
-+		sprd_spi_set_rx_length(ss, trans_len);
-+
-+		/*
-+		 * For our 3 wires mode or dual TX line mode, we need
-+		 * to request the controller to read.
-+		 */
-+		if (ss->hw_mode & SPI_3WIRE || ss->hw_mode & SPI_TX_DUAL)
-+			sprd_spi_rx_req(ss);
-+		else
-+			write_size = ss->write_bufs(ss, trans_len);
-+	}
-+
-+	if (write_size < 0) {
-+		ret = write_size;
-+		dev_err(ss->dev, "failed to write, ret = %d\n", ret);
-+		goto trans_complete;
-+	}
-+
-+	if (ss->trans_mode & SPRD_SPI_RX_MODE) {
-+		/*
-+		 * Set up the DMA receive data length, which must be an
-+		 * integral multiple of fragment length. But when the length
-+		 * of received data is less than fragment length, DMA can be
-+		 * configured to receive data according to the actual length
-+		 * of received data.
-+		 */
-+		ss->dma.rx_len = t->len > ss->dma.fragmens_len ?
-+			(t->len - t->len % ss->dma.fragmens_len) :
-+			 t->len;
-+		ret = sprd_spi_dma_rx_config(ss, t);
-+		if (ret < 0) {
-+			dev_err(&sdev->dev,
-+				"failed to configure rx DMA, ret = %d\n", ret);
-+			goto trans_complete;
-+		}
-+	}
-+
-+	sprd_spi_dma_enable(ss, true);
-+	wait_for_completion(&(ss->xfer_completion));
-+
-+	if (ss->trans_mode & SPRD_SPI_TX_MODE)
-+		ret = write_size;
-+	else
-+		ret = ss->dma.rx_len;
-+
-+trans_complete:
-+	sprd_spi_dma_enable(ss, false);
-+	sprd_spi_enter_idle(ss);
-+	sprd_spi_irq_disable(ss);
-+
-+	return ret;
-+}
-+
- static void sprd_spi_set_speed(struct sprd_spi *ss, u32 speed_hz)
- {
- 	/*
-@@ -514,16 +741,22 @@ static int sprd_spi_setup_transfer(struct spi_device *sdev,
- 		ss->trans_len = t->len;
- 		ss->read_bufs = sprd_spi_read_bufs_u8;
- 		ss->write_bufs = sprd_spi_write_bufs_u8;
-+		ss->dma.width = DMA_SLAVE_BUSWIDTH_1_BYTE;
-+		ss->dma.fragmens_len = SPRD_SPI_DMA_STEP;
- 		break;
- 	case 16:
- 		ss->trans_len = t->len >> 1;
- 		ss->read_bufs = sprd_spi_read_bufs_u16;
- 		ss->write_bufs = sprd_spi_write_bufs_u16;
-+		ss->dma.width = DMA_SLAVE_BUSWIDTH_2_BYTES;
-+		ss->dma.fragmens_len = SPRD_SPI_DMA_STEP << 1;
- 		break;
- 	case 32:
- 		ss->trans_len = t->len >> 2;
- 		ss->read_bufs = sprd_spi_read_bufs_u32;
- 		ss->write_bufs = sprd_spi_write_bufs_u32;
-+		ss->dma.width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-+		ss->dma.fragmens_len = SPRD_SPI_DMA_STEP << 2;
- 		break;
- 	default:
- 		return -EINVAL;
-@@ -561,7 +794,11 @@ static int sprd_spi_transfer_one(struct spi_controller *sctlr,
- 	if (ret)
- 		goto setup_err;
- 
--	ret = sprd_spi_txrx_bufs(sdev, t);
-+	if (sctlr->can_dma(sctlr, sdev, t))
-+		ret = sprd_spi_dma_txrx_bufs(sdev, t);
-+	else
-+		ret = sprd_spi_txrx_bufs(sdev, t);
-+
- 	if (ret == t->len)
- 		ret = 0;
- 	else if (ret >= 0)
-@@ -573,6 +810,53 @@ static int sprd_spi_transfer_one(struct spi_controller *sctlr,
- 	return ret;
- }
- 
-+static irqreturn_t sprd_spi_handle_irq(int irq, void *data)
-+{
-+	struct sprd_spi *ss = (struct sprd_spi *)data;
-+	u32 val = readl_relaxed(ss->base + SPRD_SPI_INT_MASK_STS);
-+
-+	if (val & SPRD_SPI_MASK_TX_END) {
-+		writel_relaxed(SPRD_SPI_TX_END_CLR, ss->base + SPRD_SPI_INT_CLR);
-+		if (!(ss->trans_mode & SPRD_SPI_RX_MODE))
-+			complete(&ss->xfer_completion);
-+
-+		return IRQ_HANDLED;
-+	}
-+
-+	if (val & SPRD_SPI_MASK_RX_END) {
-+		writel_relaxed(SPRD_SPI_RX_END_CLR, ss->base + SPRD_SPI_INT_CLR);
-+		if (ss->dma.rx_len < ss->len) {
-+			ss->rx_buf += ss->dma.rx_len;
-+			ss->dma.rx_len +=
-+				ss->read_bufs(ss, ss->len - ss->dma.rx_len);
-+		}
-+		complete(&ss->xfer_completion);
-+
-+		return IRQ_HANDLED;
-+	}
-+
-+	return IRQ_NONE;
-+}
-+
-+static int sprd_spi_irq_init(struct platform_device *pdev, struct sprd_spi *ss)
-+{
-+	int ret;
-+
-+	ss->irq = platform_get_irq(pdev, 0);
-+	if (ss->irq < 0) {
-+		dev_err(&pdev->dev, "failed to get irq resource\n");
-+		return ss->irq;
-+	}
-+
-+	ret = devm_request_irq(&pdev->dev, ss->irq, sprd_spi_handle_irq,
-+				0, pdev->name, ss);
-+	if (ret)
-+		dev_err(&pdev->dev, "failed to request spi irq %d, ret = %d\n",
-+			ss->irq, ret);
-+
-+	return ret;
-+}
-+
- static int sprd_spi_clk_init(struct platform_device *pdev, struct sprd_spi *ss)
- {
- 	struct clk *clk_spi, *clk_parent;
-@@ -603,6 +887,35 @@ static int sprd_spi_clk_init(struct platform_device *pdev, struct sprd_spi *ss)
- 	return 0;
- }
- 
-+static bool sprd_spi_can_dma(struct spi_controller *sctlr,
-+			     struct spi_device *spi, struct spi_transfer *t)
-+{
-+	struct sprd_spi *ss = spi_controller_get_devdata(sctlr);
-+
-+	return ss->dma.enable && (t->len > SPRD_SPI_FIFO_SIZE);
-+}
-+
-+static int sprd_spi_dma_init(struct platform_device *pdev, struct sprd_spi *ss)
-+{
-+	int ret;
-+
-+	ret = sprd_spi_dma_request(ss);
-+	if (ret) {
-+		if (ret == -EPROBE_DEFER)
-+			return ret;
-+
-+		dev_warn(&pdev->dev,
-+			 "failed to request dma, enter no dma mode, ret = %d\n",
-+			 ret);
-+
-+		return 0;
-+	}
-+
-+	ss->dma.enable = true;
-+
-+	return 0;
-+}
-+
- static int sprd_spi_probe(struct platform_device *pdev)
- {
- 	struct spi_controller *sctlr;
-@@ -623,25 +936,36 @@ static int sprd_spi_probe(struct platform_device *pdev)
- 		goto free_controller;
- 	}
- 
-+	ss->phy_base = res->start;
- 	ss->dev = &pdev->dev;
- 	sctlr->dev.of_node = pdev->dev.of_node;
- 	sctlr->mode_bits = SPI_CPOL | SPI_CPHA | SPI_3WIRE | SPI_TX_DUAL;
- 	sctlr->bus_num = pdev->id;
- 	sctlr->set_cs = sprd_spi_chipselect;
- 	sctlr->transfer_one = sprd_spi_transfer_one;
-+	sctlr->can_dma = sprd_spi_can_dma;
- 	sctlr->auto_runtime_pm = true;
- 	sctlr->max_speed_hz = min_t(u32, ss->src_clk >> 1,
- 				    SPRD_SPI_MAX_SPEED_HZ);
- 
-+	init_completion(&ss->xfer_completion);
- 	platform_set_drvdata(pdev, sctlr);
- 	ret = sprd_spi_clk_init(pdev, ss);
- 	if (ret)
- 		goto free_controller;
- 
--	ret = clk_prepare_enable(ss->clk);
-+	ret = sprd_spi_irq_init(pdev, ss);
- 	if (ret)
- 		goto free_controller;
- 
-+	ret = sprd_spi_dma_init(pdev, ss);
-+	if (ret)
-+		goto free_controller;
-+
-+	ret = clk_prepare_enable(ss->clk);
-+	if (ret)
-+		goto release_dma;
-+
- 	ret = pm_runtime_set_active(&pdev->dev);
- 	if (ret < 0)
- 		goto disable_clk;
-@@ -670,6 +994,8 @@ static int sprd_spi_probe(struct platform_device *pdev)
- 	pm_runtime_disable(&pdev->dev);
- disable_clk:
- 	clk_disable_unprepare(ss->clk);
-+release_dma:
-+	sprd_spi_dma_release(ss);
- free_controller:
- 	spi_controller_put(sctlr);
- 
-@@ -688,6 +1014,10 @@ static int sprd_spi_remove(struct platform_device *pdev)
- 		return ret;
- 	}
- 
-+	spi_controller_suspend(sctlr);
-+
-+	if (ss->dma.enable)
-+		sprd_spi_dma_release(ss);
- 	clk_disable_unprepare(ss->clk);
- 	pm_runtime_put_noidle(&pdev->dev);
- 	pm_runtime_disable(&pdev->dev);
-@@ -700,6 +1030,9 @@ static int __maybe_unused sprd_spi_runtime_suspend(struct device *dev)
- 	struct spi_controller *sctlr = dev_get_drvdata(dev);
- 	struct sprd_spi *ss = spi_controller_get_devdata(sctlr);
- 
-+	if (ss->dma.enable)
-+		sprd_spi_dma_release(ss);
-+
- 	clk_disable_unprepare(ss->clk);
- 
- 	return 0;
-@@ -715,7 +1048,14 @@ static int __maybe_unused sprd_spi_runtime_resume(struct device *dev)
- 	if (ret)
- 		return ret;
- 
--	return 0;
-+	if (!ss->dma.enable)
-+		return 0;
-+
-+	ret = sprd_spi_dma_request(ss);
-+	if (ret)
-+		clk_disable_unprepare(ss->clk);
-+
-+	return ret;
- }
- 
- static const struct dev_pm_ops sprd_spi_pm_ops = {
-diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c
-index ad1e55d3d5d5..4186ed20d796 100644
---- a/drivers/spi/spi-stm32.c
-+++ b/drivers/spi/spi-stm32.c
-@@ -1,23 +1,10 @@
--/*
-- * STMicroelectronics STM32 SPI Controller driver (master mode only)
-- *
-- * Copyright (C) 2017, STMicroelectronics - All Rights Reserved
-- * Author(s): Amelie Delaunay <amelie.delaunay@st.com> for STMicroelectronics.
-- *
-- * License terms: GPL V2.0.
-- *
-- * spi_stm32 driver is free software; you can redistribute it and/or modify it
-- * under the terms of the GNU General Public License version 2 as published by
-- * the Free Software Foundation.
-- *
-- * spi_stm32 driver is distributed in the hope that it will be useful, but
-- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
-- * details.
-- *
-- * You should have received a copy of the GNU General Public License along with
-- * spi_stm32 driver. If not, see <http://www.gnu.org/licenses/>.
-- */
-+// SPDX-License-Identifier: GPL-2.0
-+//
-+// STMicroelectronics STM32 SPI Controller driver (master mode only)
-+//
-+// Copyright (C) 2017, STMicroelectronics - All Rights Reserved
-+// Author(s): Amelie Delaunay <amelie.delaunay@st.com> for STMicroelectronics.
-+
- #include <linux/debugfs.h>
- #include <linux/clk.h>
- #include <linux/delay.h>
-@@ -33,99 +20,251 @@
- 
- #define DRIVER_NAME "spi_stm32"
- 
--/* STM32 SPI registers */
--#define STM32_SPI_CR1		0x00
--#define STM32_SPI_CR2		0x04
--#define STM32_SPI_CFG1		0x08
--#define STM32_SPI_CFG2		0x0C
--#define STM32_SPI_IER		0x10
--#define STM32_SPI_SR		0x14
--#define STM32_SPI_IFCR		0x18
--#define STM32_SPI_TXDR		0x20
--#define STM32_SPI_RXDR		0x30
--#define STM32_SPI_I2SCFGR	0x50
--
--/* STM32_SPI_CR1 bit fields */
--#define SPI_CR1_SPE		BIT(0)
--#define SPI_CR1_MASRX		BIT(8)
--#define SPI_CR1_CSTART		BIT(9)
--#define SPI_CR1_CSUSP		BIT(10)
--#define SPI_CR1_HDDIR		BIT(11)
--#define SPI_CR1_SSI		BIT(12)
--
--/* STM32_SPI_CR2 bit fields */
--#define SPI_CR2_TSIZE_SHIFT	0
--#define SPI_CR2_TSIZE		GENMASK(15, 0)
--
--/* STM32_SPI_CFG1 bit fields */
--#define SPI_CFG1_DSIZE_SHIFT	0
--#define SPI_CFG1_DSIZE		GENMASK(4, 0)
--#define SPI_CFG1_FTHLV_SHIFT	5
--#define SPI_CFG1_FTHLV		GENMASK(8, 5)
--#define SPI_CFG1_RXDMAEN	BIT(14)
--#define SPI_CFG1_TXDMAEN	BIT(15)
--#define SPI_CFG1_MBR_SHIFT	28
--#define SPI_CFG1_MBR		GENMASK(30, 28)
--#define SPI_CFG1_MBR_MIN	0
--#define SPI_CFG1_MBR_MAX	(GENMASK(30, 28) >> 28)
--
--/* STM32_SPI_CFG2 bit fields */
--#define SPI_CFG2_MIDI_SHIFT	4
--#define SPI_CFG2_MIDI		GENMASK(7, 4)
--#define SPI_CFG2_COMM_SHIFT	17
--#define SPI_CFG2_COMM		GENMASK(18, 17)
--#define SPI_CFG2_SP_SHIFT	19
--#define SPI_CFG2_SP		GENMASK(21, 19)
--#define SPI_CFG2_MASTER		BIT(22)
--#define SPI_CFG2_LSBFRST	BIT(23)
--#define SPI_CFG2_CPHA		BIT(24)
--#define SPI_CFG2_CPOL		BIT(25)
--#define SPI_CFG2_SSM		BIT(26)
--#define SPI_CFG2_AFCNTR		BIT(31)
--
--/* STM32_SPI_IER bit fields */
--#define SPI_IER_RXPIE		BIT(0)
--#define SPI_IER_TXPIE		BIT(1)
--#define SPI_IER_DXPIE		BIT(2)
--#define SPI_IER_EOTIE		BIT(3)
--#define SPI_IER_TXTFIE		BIT(4)
--#define SPI_IER_OVRIE		BIT(6)
--#define SPI_IER_MODFIE		BIT(9)
--#define SPI_IER_ALL		GENMASK(10, 0)
--
--/* STM32_SPI_SR bit fields */
--#define SPI_SR_RXP		BIT(0)
--#define SPI_SR_TXP		BIT(1)
--#define SPI_SR_EOT		BIT(3)
--#define SPI_SR_OVR		BIT(6)
--#define SPI_SR_MODF		BIT(9)
--#define SPI_SR_SUSP		BIT(11)
--#define SPI_SR_RXPLVL_SHIFT	13
--#define SPI_SR_RXPLVL		GENMASK(14, 13)
--#define SPI_SR_RXWNE		BIT(15)
--
--/* STM32_SPI_IFCR bit fields */
--#define SPI_IFCR_ALL		GENMASK(11, 3)
--
--/* STM32_SPI_I2SCFGR bit fields */
--#define SPI_I2SCFGR_I2SMOD	BIT(0)
--
--/* SPI Master Baud Rate min/max divisor */
--#define SPI_MBR_DIV_MIN		(2 << SPI_CFG1_MBR_MIN)
--#define SPI_MBR_DIV_MAX		(2 << SPI_CFG1_MBR_MAX)
--
--/* SPI Communication mode */
-+/* STM32F4 SPI registers */
-+#define STM32F4_SPI_CR1			0x00
-+#define STM32F4_SPI_CR2			0x04
-+#define STM32F4_SPI_SR			0x08
-+#define STM32F4_SPI_DR			0x0C
-+#define STM32F4_SPI_I2SCFGR		0x1C
-+
-+/* STM32F4_SPI_CR1 bit fields */
-+#define STM32F4_SPI_CR1_CPHA		BIT(0)
-+#define STM32F4_SPI_CR1_CPOL		BIT(1)
-+#define STM32F4_SPI_CR1_MSTR		BIT(2)
-+#define STM32F4_SPI_CR1_BR_SHIFT	3
-+#define STM32F4_SPI_CR1_BR		GENMASK(5, 3)
-+#define STM32F4_SPI_CR1_SPE		BIT(6)
-+#define STM32F4_SPI_CR1_LSBFRST		BIT(7)
-+#define STM32F4_SPI_CR1_SSI		BIT(8)
-+#define STM32F4_SPI_CR1_SSM		BIT(9)
-+#define STM32F4_SPI_CR1_RXONLY		BIT(10)
-+#define STM32F4_SPI_CR1_DFF		BIT(11)
-+#define STM32F4_SPI_CR1_CRCNEXT		BIT(12)
-+#define STM32F4_SPI_CR1_CRCEN		BIT(13)
-+#define STM32F4_SPI_CR1_BIDIOE		BIT(14)
-+#define STM32F4_SPI_CR1_BIDIMODE	BIT(15)
-+#define STM32F4_SPI_CR1_BR_MIN		0
-+#define STM32F4_SPI_CR1_BR_MAX		(GENMASK(5, 3) >> 3)
-+
-+/* STM32F4_SPI_CR2 bit fields */
-+#define STM32F4_SPI_CR2_RXDMAEN		BIT(0)
-+#define STM32F4_SPI_CR2_TXDMAEN		BIT(1)
-+#define STM32F4_SPI_CR2_SSOE		BIT(2)
-+#define STM32F4_SPI_CR2_FRF		BIT(4)
-+#define STM32F4_SPI_CR2_ERRIE		BIT(5)
-+#define STM32F4_SPI_CR2_RXNEIE		BIT(6)
-+#define STM32F4_SPI_CR2_TXEIE		BIT(7)
-+
-+/* STM32F4_SPI_SR bit fields */
-+#define STM32F4_SPI_SR_RXNE		BIT(0)
-+#define STM32F4_SPI_SR_TXE		BIT(1)
-+#define STM32F4_SPI_SR_CHSIDE		BIT(2)
-+#define STM32F4_SPI_SR_UDR		BIT(3)
-+#define STM32F4_SPI_SR_CRCERR		BIT(4)
-+#define STM32F4_SPI_SR_MODF		BIT(5)
-+#define STM32F4_SPI_SR_OVR		BIT(6)
-+#define STM32F4_SPI_SR_BSY		BIT(7)
-+#define STM32F4_SPI_SR_FRE		BIT(8)
-+
-+/* STM32F4_SPI_I2SCFGR bit fields */
-+#define STM32F4_SPI_I2SCFGR_I2SMOD	BIT(11)
-+
-+/* STM32F4 SPI Baud Rate min/max divisor */
-+#define STM32F4_SPI_BR_DIV_MIN		(2 << STM32F4_SPI_CR1_BR_MIN)
-+#define STM32F4_SPI_BR_DIV_MAX		(2 << STM32F4_SPI_CR1_BR_MAX)
-+
-+/* STM32H7 SPI registers */
-+#define STM32H7_SPI_CR1			0x00
-+#define STM32H7_SPI_CR2			0x04
-+#define STM32H7_SPI_CFG1		0x08
-+#define STM32H7_SPI_CFG2		0x0C
-+#define STM32H7_SPI_IER			0x10
-+#define STM32H7_SPI_SR			0x14
-+#define STM32H7_SPI_IFCR		0x18
-+#define STM32H7_SPI_TXDR		0x20
-+#define STM32H7_SPI_RXDR		0x30
-+#define STM32H7_SPI_I2SCFGR		0x50
-+
-+/* STM32H7_SPI_CR1 bit fields */
-+#define STM32H7_SPI_CR1_SPE		BIT(0)
-+#define STM32H7_SPI_CR1_MASRX		BIT(8)
-+#define STM32H7_SPI_CR1_CSTART		BIT(9)
-+#define STM32H7_SPI_CR1_CSUSP		BIT(10)
-+#define STM32H7_SPI_CR1_HDDIR		BIT(11)
-+#define STM32H7_SPI_CR1_SSI		BIT(12)
-+
-+/* STM32H7_SPI_CR2 bit fields */
-+#define STM32H7_SPI_CR2_TSIZE_SHIFT	0
-+#define STM32H7_SPI_CR2_TSIZE		GENMASK(15, 0)
-+
-+/* STM32H7_SPI_CFG1 bit fields */
-+#define STM32H7_SPI_CFG1_DSIZE_SHIFT	0
-+#define STM32H7_SPI_CFG1_DSIZE		GENMASK(4, 0)
-+#define STM32H7_SPI_CFG1_FTHLV_SHIFT	5
-+#define STM32H7_SPI_CFG1_FTHLV		GENMASK(8, 5)
-+#define STM32H7_SPI_CFG1_RXDMAEN	BIT(14)
-+#define STM32H7_SPI_CFG1_TXDMAEN	BIT(15)
-+#define STM32H7_SPI_CFG1_MBR_SHIFT	28
-+#define STM32H7_SPI_CFG1_MBR		GENMASK(30, 28)
-+#define STM32H7_SPI_CFG1_MBR_MIN	0
-+#define STM32H7_SPI_CFG1_MBR_MAX	(GENMASK(30, 28) >> 28)
-+
-+/* STM32H7_SPI_CFG2 bit fields */
-+#define STM32H7_SPI_CFG2_MIDI_SHIFT	4
-+#define STM32H7_SPI_CFG2_MIDI		GENMASK(7, 4)
-+#define STM32H7_SPI_CFG2_COMM_SHIFT	17
-+#define STM32H7_SPI_CFG2_COMM		GENMASK(18, 17)
-+#define STM32H7_SPI_CFG2_SP_SHIFT	19
-+#define STM32H7_SPI_CFG2_SP		GENMASK(21, 19)
-+#define STM32H7_SPI_CFG2_MASTER		BIT(22)
-+#define STM32H7_SPI_CFG2_LSBFRST	BIT(23)
-+#define STM32H7_SPI_CFG2_CPHA		BIT(24)
-+#define STM32H7_SPI_CFG2_CPOL		BIT(25)
-+#define STM32H7_SPI_CFG2_SSM		BIT(26)
-+#define STM32H7_SPI_CFG2_AFCNTR		BIT(31)
-+
-+/* STM32H7_SPI_IER bit fields */
-+#define STM32H7_SPI_IER_RXPIE		BIT(0)
-+#define STM32H7_SPI_IER_TXPIE		BIT(1)
-+#define STM32H7_SPI_IER_DXPIE		BIT(2)
-+#define STM32H7_SPI_IER_EOTIE		BIT(3)
-+#define STM32H7_SPI_IER_TXTFIE		BIT(4)
-+#define STM32H7_SPI_IER_OVRIE		BIT(6)
-+#define STM32H7_SPI_IER_MODFIE		BIT(9)
-+#define STM32H7_SPI_IER_ALL		GENMASK(10, 0)
-+
-+/* STM32H7_SPI_SR bit fields */
-+#define STM32H7_SPI_SR_RXP		BIT(0)
-+#define STM32H7_SPI_SR_TXP		BIT(1)
-+#define STM32H7_SPI_SR_EOT		BIT(3)
-+#define STM32H7_SPI_SR_OVR		BIT(6)
-+#define STM32H7_SPI_SR_MODF		BIT(9)
-+#define STM32H7_SPI_SR_SUSP		BIT(11)
-+#define STM32H7_SPI_SR_RXPLVL_SHIFT	13
-+#define STM32H7_SPI_SR_RXPLVL		GENMASK(14, 13)
-+#define STM32H7_SPI_SR_RXWNE		BIT(15)
-+
-+/* STM32H7_SPI_IFCR bit fields */
-+#define STM32H7_SPI_IFCR_ALL		GENMASK(11, 3)
-+
-+/* STM32H7_SPI_I2SCFGR bit fields */
-+#define STM32H7_SPI_I2SCFGR_I2SMOD	BIT(0)
-+
-+/* STM32H7 SPI Master Baud Rate min/max divisor */
-+#define STM32H7_SPI_MBR_DIV_MIN		(2 << STM32H7_SPI_CFG1_MBR_MIN)
-+#define STM32H7_SPI_MBR_DIV_MAX		(2 << STM32H7_SPI_CFG1_MBR_MAX)
-+
-+/* STM32H7 SPI Communication mode */
-+#define STM32H7_SPI_FULL_DUPLEX		0
-+#define STM32H7_SPI_SIMPLEX_TX		1
-+#define STM32H7_SPI_SIMPLEX_RX		2
-+#define STM32H7_SPI_HALF_DUPLEX		3
-+
-+/* SPI Communication type */
- #define SPI_FULL_DUPLEX		0
- #define SPI_SIMPLEX_TX		1
- #define SPI_SIMPLEX_RX		2
--#define SPI_HALF_DUPLEX		3
-+#define SPI_3WIRE_TX		3
-+#define SPI_3WIRE_RX		4
- 
- #define SPI_1HZ_NS		1000000000
- 
-+/*
-+ * use PIO for small transfers, avoiding DMA setup/teardown overhead for drivers
-+ * without fifo buffers.
-+ */
-+#define SPI_DMA_MIN_BYTES	16
-+
-+/**
-+ * stm32_spi_reg - stm32 SPI register & bitfield desc
-+ * @reg:		register offset
-+ * @mask:		bitfield mask
-+ * @shift:		left shift
-+ */
-+struct stm32_spi_reg {
-+	int reg;
-+	int mask;
-+	int shift;
-+};
-+
-+/**
-+ * stm32_spi_regspec - stm32 registers definition, compatible dependent data
-+ * en: enable register and SPI enable bit
-+ * dma_rx_en: SPI DMA RX enable register end SPI DMA RX enable bit
-+ * dma_tx_en: SPI DMA TX enable register end SPI DMA TX enable bit
-+ * cpol: clock polarity register and polarity bit
-+ * cpha: clock phase register and phase bit
-+ * lsb_first: LSB transmitted first register and bit
-+ * br: baud rate register and bitfields
-+ * rx: SPI RX data register
-+ * tx: SPI TX data register
-+ */
-+struct stm32_spi_regspec {
-+	const struct stm32_spi_reg en;
-+	const struct stm32_spi_reg dma_rx_en;
-+	const struct stm32_spi_reg dma_tx_en;
-+	const struct stm32_spi_reg cpol;
-+	const struct stm32_spi_reg cpha;
-+	const struct stm32_spi_reg lsb_first;
-+	const struct stm32_spi_reg br;
-+	const struct stm32_spi_reg rx;
-+	const struct stm32_spi_reg tx;
-+};
-+
-+struct stm32_spi;
-+
-+/**
-+ * stm32_spi_cfg - stm32 compatible configuration data
-+ * @regs: registers descriptions
-+ * @get_fifo_size: routine to get fifo size
-+ * @get_bpw_mask: routine to get bits per word mask
-+ * @disable: routine to disable controller
-+ * @config: routine to configure controller as SPI Master
-+ * @set_bpw: routine to configure registers to for bits per word
-+ * @set_mode: routine to configure registers to desired mode
-+ * @set_data_idleness: optional routine to configure registers to desired idle
-+ * time between frames (if driver has this functionality)
-+ * set_number_of_data: optional routine to configure registers to desired
-+ * number of data (if driver has this functionality)
-+ * @can_dma: routine to determine if the transfer is eligible for DMA use
-+ * @transfer_one_dma_start: routine to start transfer a single spi_transfer
-+ * using DMA
-+ * @dma_rx cb: routine to call after DMA RX channel operation is complete
-+ * @dma_tx cb: routine to call after DMA TX channel operation is complete
-+ * @transfer_one_irq: routine to configure interrupts for driver
-+ * @irq_handler_event: Interrupt handler for SPI controller events
-+ * @irq_handler_thread: thread of interrupt handler for SPI controller
-+ * @baud_rate_div_min: minimum baud rate divisor
-+ * @baud_rate_div_max: maximum baud rate divisor
-+ * @has_fifo: boolean to know if fifo is used for driver
-+ * @has_startbit: boolean to know if start bit is used to start transfer
-+ */
-+struct stm32_spi_cfg {
-+	const struct stm32_spi_regspec *regs;
-+	int (*get_fifo_size)(struct stm32_spi *spi);
-+	int (*get_bpw_mask)(struct stm32_spi *spi);
-+	void (*disable)(struct stm32_spi *spi);
-+	int (*config)(struct stm32_spi *spi);
-+	void (*set_bpw)(struct stm32_spi *spi);
-+	int (*set_mode)(struct stm32_spi *spi, unsigned int comm_type);
-+	void (*set_data_idleness)(struct stm32_spi *spi, u32 length);
-+	int (*set_number_of_data)(struct stm32_spi *spi, u32 length);
-+	void (*transfer_one_dma_start)(struct stm32_spi *spi);
-+	void (*dma_rx_cb)(void *data);
-+	void (*dma_tx_cb)(void *data);
-+	int (*transfer_one_irq)(struct stm32_spi *spi);
-+	irqreturn_t (*irq_handler_event)(int irq, void *dev_id);
-+	irqreturn_t (*irq_handler_thread)(int irq, void *dev_id);
-+	unsigned int baud_rate_div_min;
-+	unsigned int baud_rate_div_max;
-+	bool has_fifo;
-+};
-+
- /**
-  * struct stm32_spi - private data of the SPI controller
-  * @dev: driver model representation of the controller
-  * @master: controller master interface
-+ * @cfg: compatible configuration data
-  * @base: virtual memory area
-  * @clk: hw kernel clock feeding the SPI clock generator
-  * @clk_rate: rate of the hw kernel clock feeding the SPI clock generator
-@@ -151,6 +290,7 @@
- struct stm32_spi {
- 	struct device *dev;
- 	struct spi_master *master;
-+	const struct stm32_spi_cfg *cfg;
- 	void __iomem *base;
- 	struct clk *clk;
- 	u32 clk_rate;
-@@ -176,6 +316,40 @@ struct stm32_spi {
- 	dma_addr_t phys_addr;
- };
- 
-+static const struct stm32_spi_regspec stm32f4_spi_regspec = {
-+	.en = { STM32F4_SPI_CR1, STM32F4_SPI_CR1_SPE },
-+
-+	.dma_rx_en = { STM32F4_SPI_CR2, STM32F4_SPI_CR2_RXDMAEN },
-+	.dma_tx_en = { STM32F4_SPI_CR2, STM32F4_SPI_CR2_TXDMAEN },
-+
-+	.cpol = { STM32F4_SPI_CR1, STM32F4_SPI_CR1_CPOL },
-+	.cpha = { STM32F4_SPI_CR1, STM32F4_SPI_CR1_CPHA },
-+	.lsb_first = { STM32F4_SPI_CR1, STM32F4_SPI_CR1_LSBFRST },
-+	.br = { STM32F4_SPI_CR1, STM32F4_SPI_CR1_BR, STM32F4_SPI_CR1_BR_SHIFT },
-+
-+	.rx = { STM32F4_SPI_DR },
-+	.tx = { STM32F4_SPI_DR },
-+};
-+
-+static const struct stm32_spi_regspec stm32h7_spi_regspec = {
-+	/* SPI data transfer is enabled but spi_ker_ck is idle.
-+	 * CFG1 and CFG2 registers are write protected when SPE is enabled.
-+	 */
-+	.en = { STM32H7_SPI_CR1, STM32H7_SPI_CR1_SPE },
-+
-+	.dma_rx_en = { STM32H7_SPI_CFG1, STM32H7_SPI_CFG1_RXDMAEN },
-+	.dma_tx_en = { STM32H7_SPI_CFG1, STM32H7_SPI_CFG1_TXDMAEN },
-+
-+	.cpol = { STM32H7_SPI_CFG2, STM32H7_SPI_CFG2_CPOL },
-+	.cpha = { STM32H7_SPI_CFG2, STM32H7_SPI_CFG2_CPHA },
-+	.lsb_first = { STM32H7_SPI_CFG2, STM32H7_SPI_CFG2_LSBFRST },
-+	.br = { STM32H7_SPI_CFG1, STM32H7_SPI_CFG1_MBR,
-+		STM32H7_SPI_CFG1_MBR_SHIFT },
-+
-+	.rx = { STM32H7_SPI_RXDR },
-+	.tx = { STM32H7_SPI_TXDR },
-+};
-+
- static inline void stm32_spi_set_bits(struct stm32_spi *spi,
- 				      u32 offset, u32 bits)
- {
-@@ -191,22 +365,22 @@ static inline void stm32_spi_clr_bits(struct stm32_spi *spi,
- }
- 
- /**
-- * stm32_spi_get_fifo_size - Return fifo size
-+ * stm32h7_spi_get_fifo_size - Return fifo size
-  * @spi: pointer to the spi controller data structure
-  */
--static int stm32_spi_get_fifo_size(struct stm32_spi *spi)
-+static int stm32h7_spi_get_fifo_size(struct stm32_spi *spi)
- {
- 	unsigned long flags;
- 	u32 count = 0;
- 
- 	spin_lock_irqsave(&spi->lock, flags);
- 
--	stm32_spi_set_bits(spi, STM32_SPI_CR1, SPI_CR1_SPE);
-+	stm32_spi_set_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_SPE);
- 
--	while (readl_relaxed(spi->base + STM32_SPI_SR) & SPI_SR_TXP)
--		writeb_relaxed(++count, spi->base + STM32_SPI_TXDR);
-+	while (readl_relaxed(spi->base + STM32H7_SPI_SR) & STM32H7_SPI_SR_TXP)
-+		writeb_relaxed(++count, spi->base + STM32H7_SPI_TXDR);
- 
--	stm32_spi_clr_bits(spi, STM32_SPI_CR1, SPI_CR1_SPE);
-+	stm32_spi_clr_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_SPE);
- 
- 	spin_unlock_irqrestore(&spi->lock, flags);
- 
-@@ -216,10 +390,20 @@ static int stm32_spi_get_fifo_size(struct stm32_spi *spi)
- }
- 
- /**
-- * stm32_spi_get_bpw_mask - Return bits per word mask
-+ * stm32f4_spi_get_bpw_mask - Return bits per word mask
-  * @spi: pointer to the spi controller data structure
-  */
--static int stm32_spi_get_bpw_mask(struct stm32_spi *spi)
-+static int stm32f4_spi_get_bpw_mask(struct stm32_spi *spi)
-+{
-+	dev_dbg(spi->dev, "8-bit or 16-bit data frame supported\n");
-+	return SPI_BPW_MASK(8) | SPI_BPW_MASK(16);
-+}
-+
-+/**
-+ * stm32h7_spi_get_bpw_mask - Return bits per word mask
-+ * @spi: pointer to the spi controller data structure
-+ */
-+static int stm32h7_spi_get_bpw_mask(struct stm32_spi *spi)
- {
- 	unsigned long flags;
- 	u32 cfg1, max_bpw;
-@@ -230,10 +414,11 @@ static int stm32_spi_get_bpw_mask(struct stm32_spi *spi)
- 	 * The most significant bit at DSIZE bit field is reserved when the
- 	 * maximum data size of periperal instances is limited to 16-bit
- 	 */
--	stm32_spi_set_bits(spi, STM32_SPI_CFG1, SPI_CFG1_DSIZE);
-+	stm32_spi_set_bits(spi, STM32H7_SPI_CFG1, STM32H7_SPI_CFG1_DSIZE);
- 
--	cfg1 = readl_relaxed(spi->base + STM32_SPI_CFG1);
--	max_bpw = (cfg1 & SPI_CFG1_DSIZE) >> SPI_CFG1_DSIZE_SHIFT;
-+	cfg1 = readl_relaxed(spi->base + STM32H7_SPI_CFG1);
-+	max_bpw = (cfg1 & STM32H7_SPI_CFG1_DSIZE) >>
-+		  STM32H7_SPI_CFG1_DSIZE_SHIFT;
- 	max_bpw += 1;
- 
- 	spin_unlock_irqrestore(&spi->lock, flags);
-@@ -244,13 +429,16 @@ static int stm32_spi_get_bpw_mask(struct stm32_spi *spi)
- }
- 
- /**
-- * stm32_spi_prepare_mbr - Determine SPI_CFG1.MBR value
-+ * stm32_spi_prepare_mbr - Determine baud rate divisor value
-  * @spi: pointer to the spi controller data structure
-  * @speed_hz: requested speed
-+ * @min_div: minimum baud rate divisor
-+ * @max_div: maximum baud rate divisor
-  *
-- * Return SPI_CFG1.MBR value in case of success or -EINVAL
-+ * Return baud rate divisor value in case of success or -EINVAL
-  */
--static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz)
-+static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz,
-+				 u32 min_div, u32 max_div)
- {
- 	u32 div, mbrdiv;
- 
-@@ -263,8 +451,7 @@ static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz)
- 	 * no need to check it there.
- 	 * However, we need to ensure the following calculations.
- 	 */
--	if (div < SPI_MBR_DIV_MIN ||
--	    div > SPI_MBR_DIV_MAX)
-+	if ((div < min_div) || (div > max_div))
- 		return -EINVAL;
- 
- 	/* Determine the first power of 2 greater than or equal to div */
-@@ -279,10 +466,10 @@ static int stm32_spi_prepare_mbr(struct stm32_spi *spi, u32 speed_hz)
- }
- 
- /**
-- * stm32_spi_prepare_fthlv - Determine FIFO threshold level
-+ * stm32h7_spi_prepare_fthlv - Determine FIFO threshold level
-  * @spi: pointer to the spi controller data structure
-  */
--static u32 stm32_spi_prepare_fthlv(struct stm32_spi *spi)
-+static u32 stm32h7_spi_prepare_fthlv(struct stm32_spi *spi)
- {
- 	u32 fthlv, half_fifo;
- 
-@@ -306,32 +493,62 @@ static u32 stm32_spi_prepare_fthlv(struct stm32_spi *spi)
- }
- 
- /**
-- * stm32_spi_write_txfifo - Write bytes in Transmit Data Register
-+ * stm32f4_spi_write_tx - Write bytes to Transmit Data Register
-  * @spi: pointer to the spi controller data structure
-  *
-  * Read from tx_buf depends on remaining bytes to avoid to read beyond
-  * tx_buf end.
-  */
--static void stm32_spi_write_txfifo(struct stm32_spi *spi)
-+static void stm32f4_spi_write_tx(struct stm32_spi *spi)
-+{
-+	if ((spi->tx_len > 0) && (readl_relaxed(spi->base + STM32F4_SPI_SR) &
-+				  STM32F4_SPI_SR_TXE)) {
-+		u32 offs = spi->cur_xferlen - spi->tx_len;
-+
-+		if (spi->cur_bpw == 16) {
-+			const u16 *tx_buf16 = (const u16 *)(spi->tx_buf + offs);
-+
-+			writew_relaxed(*tx_buf16, spi->base + STM32F4_SPI_DR);
-+			spi->tx_len -= sizeof(u16);
-+		} else {
-+			const u8 *tx_buf8 = (const u8 *)(spi->tx_buf + offs);
-+
-+			writeb_relaxed(*tx_buf8, spi->base + STM32F4_SPI_DR);
-+			spi->tx_len -= sizeof(u8);
-+		}
-+	}
-+
-+	dev_dbg(spi->dev, "%s: %d bytes left\n", __func__, spi->tx_len);
-+}
-+
-+/**
-+ * stm32h7_spi_write_txfifo - Write bytes in Transmit Data Register
-+ * @spi: pointer to the spi controller data structure
-+ *
-+ * Read from tx_buf depends on remaining bytes to avoid to read beyond
-+ * tx_buf end.
-+ */
-+static void stm32h7_spi_write_txfifo(struct stm32_spi *spi)
- {
- 	while ((spi->tx_len > 0) &&
--	       (readl_relaxed(spi->base + STM32_SPI_SR) & SPI_SR_TXP)) {
-+		       (readl_relaxed(spi->base + STM32H7_SPI_SR) &
-+			STM32H7_SPI_SR_TXP)) {
- 		u32 offs = spi->cur_xferlen - spi->tx_len;
- 
- 		if (spi->tx_len >= sizeof(u32)) {
- 			const u32 *tx_buf32 = (const u32 *)(spi->tx_buf + offs);
- 
--			writel_relaxed(*tx_buf32, spi->base + STM32_SPI_TXDR);
-+			writel_relaxed(*tx_buf32, spi->base + STM32H7_SPI_TXDR);
- 			spi->tx_len -= sizeof(u32);
- 		} else if (spi->tx_len >= sizeof(u16)) {
- 			const u16 *tx_buf16 = (const u16 *)(spi->tx_buf + offs);
- 
--			writew_relaxed(*tx_buf16, spi->base + STM32_SPI_TXDR);
-+			writew_relaxed(*tx_buf16, spi->base + STM32H7_SPI_TXDR);
- 			spi->tx_len -= sizeof(u16);
- 		} else {
- 			const u8 *tx_buf8 = (const u8 *)(spi->tx_buf + offs);
- 
--			writeb_relaxed(*tx_buf8, spi->base + STM32_SPI_TXDR);
-+			writeb_relaxed(*tx_buf8, spi->base + STM32H7_SPI_TXDR);
- 			spi->tx_len -= sizeof(u8);
- 		}
- 	}
-@@ -340,43 +557,74 @@ static void stm32_spi_write_txfifo(struct stm32_spi *spi)
- }
- 
- /**
-- * stm32_spi_read_rxfifo - Read bytes in Receive Data Register
-+ * stm32f4_spi_read_rx - Read bytes from Receive Data Register
-+ * @spi: pointer to the spi controller data structure
-+ *
-+ * Write in rx_buf depends on remaining bytes to avoid to write beyond
-+ * rx_buf end.
-+ */
-+static void stm32f4_spi_read_rx(struct stm32_spi *spi)
-+{
-+	if ((spi->rx_len > 0) && (readl_relaxed(spi->base + STM32F4_SPI_SR) &
-+				  STM32F4_SPI_SR_RXNE)) {
-+		u32 offs = spi->cur_xferlen - spi->rx_len;
-+
-+		if (spi->cur_bpw == 16) {
-+			u16 *rx_buf16 = (u16 *)(spi->rx_buf + offs);
-+
-+			*rx_buf16 = readw_relaxed(spi->base + STM32F4_SPI_DR);
-+			spi->rx_len -= sizeof(u16);
-+		} else {
-+			u8 *rx_buf8 = (u8 *)(spi->rx_buf + offs);
-+
-+			*rx_buf8 = readb_relaxed(spi->base + STM32F4_SPI_DR);
-+			spi->rx_len -= sizeof(u8);
-+		}
-+	}
-+
-+	dev_dbg(spi->dev, "%s: %d bytes left\n", __func__, spi->rx_len);
-+}
-+
-+/**
-+ * stm32h7_spi_read_rxfifo - Read bytes in Receive Data Register
-  * @spi: pointer to the spi controller data structure
-  *
-  * Write in rx_buf depends on remaining bytes to avoid to write beyond
-  * rx_buf end.
-  */
--static void stm32_spi_read_rxfifo(struct stm32_spi *spi, bool flush)
-+static void stm32h7_spi_read_rxfifo(struct stm32_spi *spi, bool flush)
- {
--	u32 sr = readl_relaxed(spi->base + STM32_SPI_SR);
--	u32 rxplvl = (sr & SPI_SR_RXPLVL) >> SPI_SR_RXPLVL_SHIFT;
-+	u32 sr = readl_relaxed(spi->base + STM32H7_SPI_SR);
-+	u32 rxplvl = (sr & STM32H7_SPI_SR_RXPLVL) >>
-+		     STM32H7_SPI_SR_RXPLVL_SHIFT;
- 
- 	while ((spi->rx_len > 0) &&
--	       ((sr & SPI_SR_RXP) ||
--		(flush && ((sr & SPI_SR_RXWNE) || (rxplvl > 0))))) {
-+	       ((sr & STM32H7_SPI_SR_RXP) ||
-+		(flush && ((sr & STM32H7_SPI_SR_RXWNE) || (rxplvl > 0))))) {
- 		u32 offs = spi->cur_xferlen - spi->rx_len;
- 
- 		if ((spi->rx_len >= sizeof(u32)) ||
--		    (flush && (sr & SPI_SR_RXWNE))) {
-+		    (flush && (sr & STM32H7_SPI_SR_RXWNE))) {
- 			u32 *rx_buf32 = (u32 *)(spi->rx_buf + offs);
- 
--			*rx_buf32 = readl_relaxed(spi->base + STM32_SPI_RXDR);
-+			*rx_buf32 = readl_relaxed(spi->base + STM32H7_SPI_RXDR);
- 			spi->rx_len -= sizeof(u32);
- 		} else if ((spi->rx_len >= sizeof(u16)) ||
- 			   (flush && (rxplvl >= 2 || spi->cur_bpw > 8))) {
- 			u16 *rx_buf16 = (u16 *)(spi->rx_buf + offs);
- 
--			*rx_buf16 = readw_relaxed(spi->base + STM32_SPI_RXDR);
-+			*rx_buf16 = readw_relaxed(spi->base + STM32H7_SPI_RXDR);
- 			spi->rx_len -= sizeof(u16);
- 		} else {
- 			u8 *rx_buf8 = (u8 *)(spi->rx_buf + offs);
- 
--			*rx_buf8 = readb_relaxed(spi->base + STM32_SPI_RXDR);
-+			*rx_buf8 = readb_relaxed(spi->base + STM32H7_SPI_RXDR);
- 			spi->rx_len -= sizeof(u8);
- 		}
- 
--		sr = readl_relaxed(spi->base + STM32_SPI_SR);
--		rxplvl = (sr & SPI_SR_RXPLVL) >> SPI_SR_RXPLVL_SHIFT;
-+		sr = readl_relaxed(spi->base + STM32H7_SPI_SR);
-+		rxplvl = (sr & STM32H7_SPI_SR_RXPLVL) >>
-+			 STM32H7_SPI_SR_RXPLVL_SHIFT;
- 	}
- 
- 	dev_dbg(spi->dev, "%s%s: %d bytes left\n", __func__,
-@@ -386,26 +634,76 @@ static void stm32_spi_read_rxfifo(struct stm32_spi *spi, bool flush)
- /**
-  * stm32_spi_enable - Enable SPI controller
-  * @spi: pointer to the spi controller data structure
-- *
-- * SPI data transfer is enabled but spi_ker_ck is idle.
-- * SPI_CFG1 and SPI_CFG2 are now write protected.
-  */
- static void stm32_spi_enable(struct stm32_spi *spi)
- {
- 	dev_dbg(spi->dev, "enable controller\n");
- 
--	stm32_spi_set_bits(spi, STM32_SPI_CR1, SPI_CR1_SPE);
-+	stm32_spi_set_bits(spi, spi->cfg->regs->en.reg,
-+			   spi->cfg->regs->en.mask);
- }
- 
- /**
-- * stm32_spi_disable - Disable SPI controller
-+ * stm32f4_spi_disable - Disable SPI controller
-+ * @spi: pointer to the spi controller data structure
-+ */
-+static void stm32f4_spi_disable(struct stm32_spi *spi)
-+{
-+	unsigned long flags;
-+	u32 sr;
-+
-+	dev_dbg(spi->dev, "disable controller\n");
-+
-+	spin_lock_irqsave(&spi->lock, flags);
-+
-+	if (!(readl_relaxed(spi->base + STM32F4_SPI_CR1) &
-+	      STM32F4_SPI_CR1_SPE)) {
-+		spin_unlock_irqrestore(&spi->lock, flags);
-+		return;
-+	}
-+
-+	/* Disable interrupts */
-+	stm32_spi_clr_bits(spi, STM32F4_SPI_CR2, STM32F4_SPI_CR2_TXEIE |
-+						 STM32F4_SPI_CR2_RXNEIE |
-+						 STM32F4_SPI_CR2_ERRIE);
-+
-+	/* Wait until BSY = 0 */
-+	if (readl_relaxed_poll_timeout_atomic(spi->base + STM32F4_SPI_SR,
-+					      sr, !(sr & STM32F4_SPI_SR_BSY),
-+					      10, 100000) < 0) {
-+		dev_warn(spi->dev, "disabling condition timeout\n");
-+	}
-+
-+	if (spi->cur_usedma && spi->dma_tx)
-+		dmaengine_terminate_all(spi->dma_tx);
-+	if (spi->cur_usedma && spi->dma_rx)
-+		dmaengine_terminate_all(spi->dma_rx);
-+
-+	stm32_spi_clr_bits(spi, STM32F4_SPI_CR1, STM32F4_SPI_CR1_SPE);
-+
-+	stm32_spi_clr_bits(spi, STM32F4_SPI_CR2, STM32F4_SPI_CR2_TXDMAEN |
-+						 STM32F4_SPI_CR2_RXDMAEN);
-+
-+	/* Sequence to clear OVR flag */
-+	readl_relaxed(spi->base + STM32F4_SPI_DR);
-+	readl_relaxed(spi->base + STM32F4_SPI_SR);
-+
-+	spin_unlock_irqrestore(&spi->lock, flags);
-+}
-+
-+/**
-+ * stm32h7_spi_disable - Disable SPI controller
-  * @spi: pointer to the spi controller data structure
-  *
-  * RX-Fifo is flushed when SPI controller is disabled. To prevent any data
-- * loss, use stm32_spi_read_rxfifo(flush) to read the remaining bytes in
-+ * loss, use stm32h7_spi_read_rxfifo(flush) to read the remaining bytes in
-  * RX-Fifo.
-+ * Normally, if TSIZE has been configured, we should relax the hardware at the
-+ * reception of the EOT interrupt. But in case of error, EOT will not be
-+ * raised. So the subsystem unprepare_message call allows us to properly
-+ * complete the transfer from an hardware point of view.
-  */
--static void stm32_spi_disable(struct stm32_spi *spi)
-+static void stm32h7_spi_disable(struct stm32_spi *spi)
- {
- 	unsigned long flags;
- 	u32 cr1, sr;
-@@ -414,23 +712,23 @@ static void stm32_spi_disable(struct stm32_spi *spi)
- 
- 	spin_lock_irqsave(&spi->lock, flags);
- 
--	cr1 = readl_relaxed(spi->base + STM32_SPI_CR1);
-+	cr1 = readl_relaxed(spi->base + STM32H7_SPI_CR1);
- 
--	if (!(cr1 & SPI_CR1_SPE)) {
-+	if (!(cr1 & STM32H7_SPI_CR1_SPE)) {
- 		spin_unlock_irqrestore(&spi->lock, flags);
- 		return;
- 	}
- 
- 	/* Wait on EOT or suspend the flow */
--	if (readl_relaxed_poll_timeout_atomic(spi->base + STM32_SPI_SR,
--					      sr, !(sr & SPI_SR_EOT),
-+	if (readl_relaxed_poll_timeout_atomic(spi->base + STM32H7_SPI_SR,
-+					      sr, !(sr & STM32H7_SPI_SR_EOT),
- 					      10, 100000) < 0) {
--		if (cr1 & SPI_CR1_CSTART) {
--			writel_relaxed(cr1 | SPI_CR1_CSUSP,
--				       spi->base + STM32_SPI_CR1);
-+		if (cr1 & STM32H7_SPI_CR1_CSTART) {
-+			writel_relaxed(cr1 | STM32H7_SPI_CR1_CSUSP,
-+				       spi->base + STM32H7_SPI_CR1);
- 			if (readl_relaxed_poll_timeout_atomic(
--						spi->base + STM32_SPI_SR,
--						sr, !(sr & SPI_SR_SUSP),
-+						spi->base + STM32H7_SPI_SR,
-+						sr, !(sr & STM32H7_SPI_SR_SUSP),
- 						10, 100000) < 0)
- 				dev_warn(spi->dev,
- 					 "Suspend request timeout\n");
-@@ -438,21 +736,21 @@ static void stm32_spi_disable(struct stm32_spi *spi)
- 	}
- 
- 	if (!spi->cur_usedma && spi->rx_buf && (spi->rx_len > 0))
--		stm32_spi_read_rxfifo(spi, true);
-+		stm32h7_spi_read_rxfifo(spi, true);
- 
--	if (spi->cur_usedma && spi->tx_buf)
-+	if (spi->cur_usedma && spi->dma_tx)
- 		dmaengine_terminate_all(spi->dma_tx);
--	if (spi->cur_usedma && spi->rx_buf)
-+	if (spi->cur_usedma && spi->dma_rx)
- 		dmaengine_terminate_all(spi->dma_rx);
- 
--	stm32_spi_clr_bits(spi, STM32_SPI_CR1, SPI_CR1_SPE);
-+	stm32_spi_clr_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_SPE);
- 
--	stm32_spi_clr_bits(spi, STM32_SPI_CFG1, SPI_CFG1_TXDMAEN |
--						SPI_CFG1_RXDMAEN);
-+	stm32_spi_clr_bits(spi, STM32H7_SPI_CFG1, STM32H7_SPI_CFG1_TXDMAEN |
-+						STM32H7_SPI_CFG1_RXDMAEN);
- 
- 	/* Disable interrupts and clear status flags */
--	writel_relaxed(0, spi->base + STM32_SPI_IER);
--	writel_relaxed(SPI_IFCR_ALL, spi->base + STM32_SPI_IFCR);
-+	writel_relaxed(0, spi->base + STM32H7_SPI_IER);
-+	writel_relaxed(STM32H7_SPI_IFCR_ALL, spi->base + STM32H7_SPI_IFCR);
- 
- 	spin_unlock_irqrestore(&spi->lock, flags);
- }
-@@ -460,26 +758,136 @@ static void stm32_spi_disable(struct stm32_spi *spi)
- /**
-  * stm32_spi_can_dma - Determine if the transfer is eligible for DMA use
-  *
-- * If the current transfer size is greater than fifo size, use DMA.
-+ * If driver has fifo and the current transfer size is greater than fifo size,
-+ * use DMA. Otherwise use DMA for transfer longer than defined DMA min bytes.
-  */
- static bool stm32_spi_can_dma(struct spi_master *master,
- 			      struct spi_device *spi_dev,
- 			      struct spi_transfer *transfer)
- {
-+	unsigned int dma_size;
- 	struct stm32_spi *spi = spi_master_get_devdata(master);
- 
-+	if (spi->cfg->has_fifo)
-+		dma_size = spi->fifo_size;
-+	else
-+		dma_size = SPI_DMA_MIN_BYTES;
-+
- 	dev_dbg(spi->dev, "%s: %s\n", __func__,
--		(transfer->len > spi->fifo_size) ? "true" : "false");
-+		(transfer->len > dma_size) ? "true" : "false");
-+
-+	return (transfer->len > dma_size);
-+}
-+
-+/**
-+ * stm32f4_spi_irq_event - Interrupt handler for SPI controller events
-+ * @irq: interrupt line
-+ * @dev_id: SPI controller master interface
-+ */
-+static irqreturn_t stm32f4_spi_irq_event(int irq, void *dev_id)
-+{
-+	struct spi_master *master = dev_id;
-+	struct stm32_spi *spi = spi_master_get_devdata(master);
-+	u32 sr, mask = 0;
-+	unsigned long flags;
-+	bool end = false;
-+
-+	spin_lock_irqsave(&spi->lock, flags);
-+
-+	sr = readl_relaxed(spi->base + STM32F4_SPI_SR);
-+	/*
-+	 * BSY flag is not handled in interrupt but it is normal behavior when
-+	 * this flag is set.
-+	 */
-+	sr &= ~STM32F4_SPI_SR_BSY;
-+
-+	if (!spi->cur_usedma && (spi->cur_comm == SPI_SIMPLEX_TX ||
-+				 spi->cur_comm == SPI_3WIRE_TX)) {
-+		/* OVR flag shouldn't be handled for TX only mode */
-+		sr &= ~STM32F4_SPI_SR_OVR | STM32F4_SPI_SR_RXNE;
-+		mask |= STM32F4_SPI_SR_TXE;
-+	}
-+
-+	if (!spi->cur_usedma && spi->cur_comm == SPI_FULL_DUPLEX) {
-+		/* TXE flag is set and is handled when RXNE flag occurs */
-+		sr &= ~STM32F4_SPI_SR_TXE;
-+		mask |= STM32F4_SPI_SR_RXNE | STM32F4_SPI_SR_OVR;
-+	}
-+
-+	if (!(sr & mask)) {
-+		dev_dbg(spi->dev, "spurious IT (sr=0x%08x)\n", sr);
-+		spin_unlock_irqrestore(&spi->lock, flags);
-+		return IRQ_NONE;
-+	}
-+
-+	if (sr & STM32F4_SPI_SR_OVR) {
-+		dev_warn(spi->dev, "Overrun: received value discarded\n");
-+
-+		/* Sequence to clear OVR flag */
-+		readl_relaxed(spi->base + STM32F4_SPI_DR);
-+		readl_relaxed(spi->base + STM32F4_SPI_SR);
-+
-+		/*
-+		 * If overrun is detected, it means that something went wrong,
-+		 * so stop the current transfer. Transfer can wait for next
-+		 * RXNE but DR is already read and end never happens.
-+		 */
-+		end = true;
-+		goto end_irq;
-+	}
-+
-+	if (sr & STM32F4_SPI_SR_TXE) {
-+		if (spi->tx_buf)
-+			stm32f4_spi_write_tx(spi);
-+		if (spi->tx_len == 0)
-+			end = true;
-+	}
-+
-+	if (sr & STM32F4_SPI_SR_RXNE) {
-+		stm32f4_spi_read_rx(spi);
-+		if (spi->rx_len == 0)
-+			end = true;
-+		else /* Load data for discontinuous mode */
-+			stm32f4_spi_write_tx(spi);
-+	}
-+
-+end_irq:
-+	if (end) {
-+		/* Immediately disable interrupts to do not generate new one */
-+		stm32_spi_clr_bits(spi, STM32F4_SPI_CR2,
-+					STM32F4_SPI_CR2_TXEIE |
-+					STM32F4_SPI_CR2_RXNEIE |
-+					STM32F4_SPI_CR2_ERRIE);
-+		spin_unlock_irqrestore(&spi->lock, flags);
-+		return IRQ_WAKE_THREAD;
-+	}
-+
-+	spin_unlock_irqrestore(&spi->lock, flags);
-+	return IRQ_HANDLED;
-+}
-+
-+/**
-+ * stm32f4_spi_irq_thread - Thread of interrupt handler for SPI controller
-+ * @irq: interrupt line
-+ * @dev_id: SPI controller master interface
-+ */
-+static irqreturn_t stm32f4_spi_irq_thread(int irq, void *dev_id)
-+{
-+	struct spi_master *master = dev_id;
-+	struct stm32_spi *spi = spi_master_get_devdata(master);
-+
-+	spi_finalize_current_transfer(master);
-+	stm32f4_spi_disable(spi);
- 
--	return (transfer->len > spi->fifo_size);
-+	return IRQ_HANDLED;
- }
- 
- /**
-- * stm32_spi_irq - Interrupt handler for SPI controller events
-+ * stm32h7_spi_irq_thread - Thread of interrupt handler for SPI controller
-  * @irq: interrupt line
-  * @dev_id: SPI controller master interface
-  */
--static irqreturn_t stm32_spi_irq(int irq, void *dev_id)
-+static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id)
- {
- 	struct spi_master *master = dev_id;
- 	struct stm32_spi *spi = spi_master_get_devdata(master);
-@@ -489,19 +897,19 @@ static irqreturn_t stm32_spi_irq(int irq, void *dev_id)
- 
- 	spin_lock_irqsave(&spi->lock, flags);
- 
--	sr = readl_relaxed(spi->base + STM32_SPI_SR);
--	ier = readl_relaxed(spi->base + STM32_SPI_IER);
-+	sr = readl_relaxed(spi->base + STM32H7_SPI_SR);
-+	ier = readl_relaxed(spi->base + STM32H7_SPI_IER);
- 
- 	mask = ier;
- 	/* EOTIE is triggered on EOT, SUSP and TXC events. */
--	mask |= SPI_SR_SUSP;
-+	mask |= STM32H7_SPI_SR_SUSP;
- 	/*
- 	 * When TXTF is set, DXPIE and TXPIE are cleared. So in case of
- 	 * Full-Duplex, need to poll RXP event to know if there are remaining
- 	 * data, before disabling SPI.
- 	 */
- 	if (spi->rx_buf && !spi->cur_usedma)
--		mask |= SPI_SR_RXP;
-+		mask |= STM32H7_SPI_SR_RXP;
- 
- 	if (!(sr & mask)) {
- 		dev_dbg(spi->dev, "spurious IT (sr=0x%08x, ier=0x%08x)\n",
-@@ -510,10 +918,10 @@ static irqreturn_t stm32_spi_irq(int irq, void *dev_id)
- 		return IRQ_NONE;
- 	}
- 
--	if (sr & SPI_SR_SUSP) {
-+	if (sr & STM32H7_SPI_SR_SUSP) {
- 		dev_warn(spi->dev, "Communication suspended\n");
- 		if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0)))
--			stm32_spi_read_rxfifo(spi, false);
-+			stm32h7_spi_read_rxfifo(spi, false);
- 		/*
- 		 * If communication is suspended while using DMA, it means
- 		 * that something went wrong, so stop the current transfer
-@@ -522,15 +930,15 @@ static irqreturn_t stm32_spi_irq(int irq, void *dev_id)
- 			end = true;
- 	}
- 
--	if (sr & SPI_SR_MODF) {
-+	if (sr & STM32H7_SPI_SR_MODF) {
- 		dev_warn(spi->dev, "Mode fault: transfer aborted\n");
- 		end = true;
- 	}
- 
--	if (sr & SPI_SR_OVR) {
-+	if (sr & STM32H7_SPI_SR_OVR) {
- 		dev_warn(spi->dev, "Overrun: received value discarded\n");
- 		if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0)))
--			stm32_spi_read_rxfifo(spi, false);
-+			stm32h7_spi_read_rxfifo(spi, false);
- 		/*
- 		 * If overrun is detected while using DMA, it means that
- 		 * something went wrong, so stop the current transfer
-@@ -539,27 +947,27 @@ static irqreturn_t stm32_spi_irq(int irq, void *dev_id)
- 			end = true;
- 	}
- 
--	if (sr & SPI_SR_EOT) {
-+	if (sr & STM32H7_SPI_SR_EOT) {
- 		if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0)))
--			stm32_spi_read_rxfifo(spi, true);
-+			stm32h7_spi_read_rxfifo(spi, true);
- 		end = true;
- 	}
- 
--	if (sr & SPI_SR_TXP)
-+	if (sr & STM32H7_SPI_SR_TXP)
- 		if (!spi->cur_usedma && (spi->tx_buf && (spi->tx_len > 0)))
--			stm32_spi_write_txfifo(spi);
-+			stm32h7_spi_write_txfifo(spi);
- 
--	if (sr & SPI_SR_RXP)
-+	if (sr & STM32H7_SPI_SR_RXP)
- 		if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0)))
--			stm32_spi_read_rxfifo(spi, false);
-+			stm32h7_spi_read_rxfifo(spi, false);
- 
--	writel_relaxed(mask, spi->base + STM32_SPI_IFCR);
-+	writel_relaxed(mask, spi->base + STM32H7_SPI_IFCR);
- 
- 	spin_unlock_irqrestore(&spi->lock, flags);
- 
- 	if (end) {
- 		spi_finalize_current_transfer(master);
--		stm32_spi_disable(spi);
-+		stm32h7_spi_disable(spi);
- 	}
- 
- 	return IRQ_HANDLED;
-@@ -598,7 +1006,7 @@ static int stm32_spi_prepare_msg(struct spi_master *master,
- 	struct spi_device *spi_dev = msg->spi;
- 	struct device_node *np = spi_dev->dev.of_node;
- 	unsigned long flags;
--	u32 cfg2_clrb = 0, cfg2_setb = 0;
-+	u32 clrb = 0, setb = 0;
- 
- 	/* SPI slave device may need time between data frames */
- 	spi->cur_midi = 0;
-@@ -606,19 +1014,19 @@ static int stm32_spi_prepare_msg(struct spi_master *master,
- 		dev_dbg(spi->dev, "%dns inter-data idleness\n", spi->cur_midi);
- 
- 	if (spi_dev->mode & SPI_CPOL)
--		cfg2_setb |= SPI_CFG2_CPOL;
-+		setb |= spi->cfg->regs->cpol.mask;
- 	else
--		cfg2_clrb |= SPI_CFG2_CPOL;
-+		clrb |= spi->cfg->regs->cpol.mask;
- 
- 	if (spi_dev->mode & SPI_CPHA)
--		cfg2_setb |= SPI_CFG2_CPHA;
-+		setb |= spi->cfg->regs->cpha.mask;
- 	else
--		cfg2_clrb |= SPI_CFG2_CPHA;
-+		clrb |= spi->cfg->regs->cpha.mask;
- 
- 	if (spi_dev->mode & SPI_LSB_FIRST)
--		cfg2_setb |= SPI_CFG2_LSBFRST;
-+		setb |= spi->cfg->regs->lsb_first.mask;
- 	else
--		cfg2_clrb |= SPI_CFG2_LSBFRST;
-+		clrb |= spi->cfg->regs->lsb_first.mask;
- 
- 	dev_dbg(spi->dev, "cpol=%d cpha=%d lsb_first=%d cs_high=%d\n",
- 		spi_dev->mode & SPI_CPOL,
-@@ -628,11 +1036,12 @@ static int stm32_spi_prepare_msg(struct spi_master *master,
- 
- 	spin_lock_irqsave(&spi->lock, flags);
- 
--	if (cfg2_clrb || cfg2_setb)
-+	/* CPOL, CPHA and LSB FIRST bits have common register */
-+	if (clrb || setb)
- 		writel_relaxed(
--			(readl_relaxed(spi->base + STM32_SPI_CFG2) &
--				~cfg2_clrb) | cfg2_setb,
--			       spi->base + STM32_SPI_CFG2);
-+			(readl_relaxed(spi->base + spi->cfg->regs->cpol.reg) &
-+			 ~clrb) | setb,
-+			spi->base + spi->cfg->regs->cpol.reg);
- 
- 	spin_unlock_irqrestore(&spi->lock, flags);
- 
-@@ -640,12 +1049,40 @@ static int stm32_spi_prepare_msg(struct spi_master *master,
- }
- 
- /**
-- * stm32_spi_dma_cb - dma callback
-+ * stm32f4_spi_dma_tx_cb - dma callback
-+ *
-+ * DMA callback is called when the transfer is complete for DMA TX channel.
-+ */
-+static void stm32f4_spi_dma_tx_cb(void *data)
-+{
-+	struct stm32_spi *spi = data;
-+
-+	if (spi->cur_comm == SPI_SIMPLEX_TX || spi->cur_comm == SPI_3WIRE_TX) {
-+		spi_finalize_current_transfer(spi->master);
-+		stm32f4_spi_disable(spi);
-+	}
-+}
-+
-+/**
-+ * stm32f4_spi_dma_rx_cb - dma callback
-+ *
-+ * DMA callback is called when the transfer is complete for DMA RX channel.
-+ */
-+static void stm32f4_spi_dma_rx_cb(void *data)
-+{
-+	struct stm32_spi *spi = data;
-+
-+	spi_finalize_current_transfer(spi->master);
-+	stm32f4_spi_disable(spi);
-+}
-+
-+/**
-+ * stm32h7_spi_dma_cb - dma callback
-  *
-  * DMA callback is called when the transfer is complete or when an error
-  * occurs. If the transfer is complete, EOT flag is raised.
-  */
--static void stm32_spi_dma_cb(void *data)
-+static void stm32h7_spi_dma_cb(void *data)
- {
- 	struct stm32_spi *spi = data;
- 	unsigned long flags;
-@@ -653,11 +1090,11 @@ static void stm32_spi_dma_cb(void *data)
- 
- 	spin_lock_irqsave(&spi->lock, flags);
- 
--	sr = readl_relaxed(spi->base + STM32_SPI_SR);
-+	sr = readl_relaxed(spi->base + STM32H7_SPI_SR);
- 
- 	spin_unlock_irqrestore(&spi->lock, flags);
- 
--	if (!(sr & SPI_SR_EOT))
-+	if (!(sr & STM32H7_SPI_SR_EOT))
- 		dev_warn(spi->dev, "DMA error (sr=0x%08x)\n", sr);
- 
- 	/* Now wait for EOT, or SUSP or OVR in case of error */
-@@ -681,23 +1118,27 @@ static void stm32_spi_dma_config(struct stm32_spi *spi,
- 	else
- 		buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES;
- 
--	/* Valid for DMA Half or Full Fifo threshold */
--	if (spi->cur_fthlv == 2)
-+	if (spi->cfg->has_fifo) {
-+		/* Valid for DMA Half or Full Fifo threshold */
-+		if (spi->cur_fthlv == 2)
-+			maxburst = 1;
-+		else
-+			maxburst = spi->cur_fthlv;
-+	} else {
- 		maxburst = 1;
--	else
--		maxburst = spi->cur_fthlv;
-+	}
- 
- 	memset(dma_conf, 0, sizeof(struct dma_slave_config));
- 	dma_conf->direction = dir;
- 	if (dma_conf->direction == DMA_DEV_TO_MEM) { /* RX */
--		dma_conf->src_addr = spi->phys_addr + STM32_SPI_RXDR;
-+		dma_conf->src_addr = spi->phys_addr + spi->cfg->regs->rx.reg;
- 		dma_conf->src_addr_width = buswidth;
- 		dma_conf->src_maxburst = maxburst;
- 
- 		dev_dbg(spi->dev, "Rx DMA config buswidth=%d, maxburst=%d\n",
- 			buswidth, maxburst);
- 	} else if (dma_conf->direction == DMA_MEM_TO_DEV) { /* TX */
--		dma_conf->dst_addr = spi->phys_addr + STM32_SPI_TXDR;
-+		dma_conf->dst_addr = spi->phys_addr + spi->cfg->regs->tx.reg;
- 		dma_conf->dst_addr_width = buswidth;
- 		dma_conf->dst_maxburst = maxburst;
- 
-@@ -707,27 +1148,68 @@ static void stm32_spi_dma_config(struct stm32_spi *spi,
- }
- 
- /**
-- * stm32_spi_transfer_one_irq - transfer a single spi_transfer using
-- *				interrupts
-+ * stm32f4_spi_transfer_one_irq - transfer a single spi_transfer using
-+ *				  interrupts
-  *
-  * It must returns 0 if the transfer is finished or 1 if the transfer is still
-  * in progress.
-  */
--static int stm32_spi_transfer_one_irq(struct stm32_spi *spi)
-+static int stm32f4_spi_transfer_one_irq(struct stm32_spi *spi)
-+{
-+	unsigned long flags;
-+	u32 cr2 = 0;
-+
-+	/* Enable the interrupts relative to the current communication mode */
-+	if (spi->cur_comm == SPI_SIMPLEX_TX || spi->cur_comm == SPI_3WIRE_TX) {
-+		cr2 |= STM32F4_SPI_CR2_TXEIE;
-+	} else if (spi->cur_comm == SPI_FULL_DUPLEX) {
-+		/* In transmit-only mode, the OVR flag is set in the SR register
-+		 * since the received data are never read. Therefore set OVR
-+		 * interrupt only when rx buffer is available.
-+		 */
-+		cr2 |= STM32F4_SPI_CR2_RXNEIE | STM32F4_SPI_CR2_ERRIE;
-+	} else {
-+		return -EINVAL;
-+	}
-+
-+	spin_lock_irqsave(&spi->lock, flags);
-+
-+	stm32_spi_set_bits(spi, STM32F4_SPI_CR2, cr2);
-+
-+	stm32_spi_enable(spi);
-+
-+	/* starting data transfer when buffer is loaded */
-+	if (spi->tx_buf)
-+		stm32f4_spi_write_tx(spi);
-+
-+	spin_unlock_irqrestore(&spi->lock, flags);
-+
-+	return 1;
-+}
-+
-+/**
-+ * stm32h7_spi_transfer_one_irq - transfer a single spi_transfer using
-+ *				  interrupts
-+ *
-+ * It must returns 0 if the transfer is finished or 1 if the transfer is still
-+ * in progress.
-+ */
-+static int stm32h7_spi_transfer_one_irq(struct stm32_spi *spi)
- {
- 	unsigned long flags;
- 	u32 ier = 0;
- 
- 	/* Enable the interrupts relative to the current communication mode */
- 	if (spi->tx_buf && spi->rx_buf)	/* Full Duplex */
--		ier |= SPI_IER_DXPIE;
-+		ier |= STM32H7_SPI_IER_DXPIE;
- 	else if (spi->tx_buf)		/* Half-Duplex TX dir or Simplex TX */
--		ier |= SPI_IER_TXPIE;
-+		ier |= STM32H7_SPI_IER_TXPIE;
- 	else if (spi->rx_buf)		/* Half-Duplex RX dir or Simplex RX */
--		ier |= SPI_IER_RXPIE;
-+		ier |= STM32H7_SPI_IER_RXPIE;
- 
- 	/* Enable the interrupts relative to the end of transfer */
--	ier |= SPI_IER_EOTIE | SPI_IER_TXTFIE |	SPI_IER_OVRIE |	SPI_IER_MODFIE;
-+	ier |= STM32H7_SPI_IER_EOTIE | STM32H7_SPI_IER_TXTFIE |
-+	       STM32H7_SPI_IER_OVRIE | STM32H7_SPI_IER_MODFIE;
- 
- 	spin_lock_irqsave(&spi->lock, flags);
- 
-@@ -735,17 +1217,54 @@ static int stm32_spi_transfer_one_irq(struct stm32_spi *spi)
- 
- 	/* Be sure to have data in fifo before starting data transfer */
- 	if (spi->tx_buf)
--		stm32_spi_write_txfifo(spi);
-+		stm32h7_spi_write_txfifo(spi);
- 
--	stm32_spi_set_bits(spi, STM32_SPI_CR1, SPI_CR1_CSTART);
-+	stm32_spi_set_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_CSTART);
- 
--	writel_relaxed(ier, spi->base + STM32_SPI_IER);
-+	writel_relaxed(ier, spi->base + STM32H7_SPI_IER);
- 
- 	spin_unlock_irqrestore(&spi->lock, flags);
- 
- 	return 1;
- }
- 
-+/**
-+ * stm32f4_spi_transfer_one_dma_start - Set SPI driver registers to start
-+ *					transfer using DMA
-+ */
-+static void stm32f4_spi_transfer_one_dma_start(struct stm32_spi *spi)
-+{
-+	/* In DMA mode end of transfer is handled by DMA TX or RX callback. */
-+	if (spi->cur_comm == SPI_SIMPLEX_RX || spi->cur_comm == SPI_3WIRE_RX ||
-+	    spi->cur_comm == SPI_FULL_DUPLEX) {
-+		/*
-+		 * In transmit-only mode, the OVR flag is set in the SR register
-+		 * since the received data are never read. Therefore set OVR
-+		 * interrupt only when rx buffer is available.
-+		 */
-+		stm32_spi_set_bits(spi, STM32F4_SPI_CR2, STM32F4_SPI_CR2_ERRIE);
-+	}
-+
-+	stm32_spi_enable(spi);
-+}
-+
-+/**
-+ * stm32h7_spi_transfer_one_dma_start - Set SPI driver registers to start
-+ *					transfer using DMA
-+ */
-+static void stm32h7_spi_transfer_one_dma_start(struct stm32_spi *spi)
-+{
-+	/* Enable the interrupts relative to the end of transfer */
-+	stm32_spi_set_bits(spi, STM32H7_SPI_IER, STM32H7_SPI_IER_EOTIE |
-+						 STM32H7_SPI_IER_TXTFIE |
-+						 STM32H7_SPI_IER_OVRIE |
-+						 STM32H7_SPI_IER_MODFIE);
-+
-+	stm32_spi_enable(spi);
-+
-+	stm32_spi_set_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_CSTART);
-+}
-+
- /**
-  * stm32_spi_transfer_one_dma - transfer a single spi_transfer using DMA
-  *
-@@ -758,17 +1277,17 @@ static int stm32_spi_transfer_one_dma(struct stm32_spi *spi,
- 	struct dma_slave_config tx_dma_conf, rx_dma_conf;
- 	struct dma_async_tx_descriptor *tx_dma_desc, *rx_dma_desc;
- 	unsigned long flags;
--	u32 ier = 0;
- 
- 	spin_lock_irqsave(&spi->lock, flags);
- 
- 	rx_dma_desc = NULL;
--	if (spi->rx_buf) {
-+	if (spi->rx_buf && spi->dma_rx) {
- 		stm32_spi_dma_config(spi, &rx_dma_conf, DMA_DEV_TO_MEM);
- 		dmaengine_slave_config(spi->dma_rx, &rx_dma_conf);
- 
- 		/* Enable Rx DMA request */
--		stm32_spi_set_bits(spi, STM32_SPI_CFG1, SPI_CFG1_RXDMAEN);
-+		stm32_spi_set_bits(spi, spi->cfg->regs->dma_rx_en.reg,
-+				   spi->cfg->regs->dma_rx_en.mask);
- 
- 		rx_dma_desc = dmaengine_prep_slave_sg(
- 					spi->dma_rx, xfer->rx_sg.sgl,
-@@ -778,7 +1297,7 @@ static int stm32_spi_transfer_one_dma(struct stm32_spi *spi,
- 	}
- 
- 	tx_dma_desc = NULL;
--	if (spi->tx_buf) {
-+	if (spi->tx_buf && spi->dma_tx) {
- 		stm32_spi_dma_config(spi, &tx_dma_conf, DMA_MEM_TO_DEV);
- 		dmaengine_slave_config(spi->dma_tx, &tx_dma_conf);
- 
-@@ -789,12 +1308,15 @@ static int stm32_spi_transfer_one_dma(struct stm32_spi *spi,
- 					DMA_PREP_INTERRUPT);
- 	}
- 
--	if ((spi->tx_buf && !tx_dma_desc) ||
--	    (spi->rx_buf && !rx_dma_desc))
-+	if ((spi->tx_buf && spi->dma_tx && !tx_dma_desc) ||
-+	    (spi->rx_buf && spi->dma_rx && !rx_dma_desc))
-+		goto dma_desc_error;
-+
-+	if (spi->cur_comm == SPI_FULL_DUPLEX && (!tx_dma_desc || !rx_dma_desc))
- 		goto dma_desc_error;
- 
- 	if (rx_dma_desc) {
--		rx_dma_desc->callback = stm32_spi_dma_cb;
-+		rx_dma_desc->callback = spi->cfg->dma_rx_cb;
- 		rx_dma_desc->callback_param = spi;
- 
- 		if (dma_submit_error(dmaengine_submit(rx_dma_desc))) {
-@@ -806,8 +1328,9 @@ static int stm32_spi_transfer_one_dma(struct stm32_spi *spi,
- 	}
- 
- 	if (tx_dma_desc) {
--		if (spi->cur_comm == SPI_SIMPLEX_TX) {
--			tx_dma_desc->callback = stm32_spi_dma_cb;
-+		if (spi->cur_comm == SPI_SIMPLEX_TX ||
-+		    spi->cur_comm == SPI_3WIRE_TX) {
-+			tx_dma_desc->callback = spi->cfg->dma_tx_cb;
- 			tx_dma_desc->callback_param = spi;
- 		}
- 
-@@ -819,130 +1342,278 @@ static int stm32_spi_transfer_one_dma(struct stm32_spi *spi,
- 		dma_async_issue_pending(spi->dma_tx);
- 
- 		/* Enable Tx DMA request */
--		stm32_spi_set_bits(spi, STM32_SPI_CFG1, SPI_CFG1_TXDMAEN);
-+		stm32_spi_set_bits(spi, spi->cfg->regs->dma_tx_en.reg,
-+				   spi->cfg->regs->dma_tx_en.mask);
- 	}
- 
--	/* Enable the interrupts relative to the end of transfer */
--	ier |= SPI_IER_EOTIE | SPI_IER_TXTFIE |	SPI_IER_OVRIE |	SPI_IER_MODFIE;
--	writel_relaxed(ier, spi->base + STM32_SPI_IER);
--
--	stm32_spi_enable(spi);
--
--	stm32_spi_set_bits(spi, STM32_SPI_CR1, SPI_CR1_CSTART);
-+	spi->cfg->transfer_one_dma_start(spi);
- 
- 	spin_unlock_irqrestore(&spi->lock, flags);
- 
- 	return 1;
- 
- dma_submit_error:
--	if (spi->rx_buf)
-+	if (spi->dma_rx)
- 		dmaengine_terminate_all(spi->dma_rx);
- 
- dma_desc_error:
--	stm32_spi_clr_bits(spi, STM32_SPI_CFG1, SPI_CFG1_RXDMAEN);
-+	stm32_spi_clr_bits(spi, spi->cfg->regs->dma_rx_en.reg,
-+			   spi->cfg->regs->dma_rx_en.mask);
- 
- 	spin_unlock_irqrestore(&spi->lock, flags);
- 
- 	dev_info(spi->dev, "DMA issue: fall back to irq transfer\n");
- 
--	return stm32_spi_transfer_one_irq(spi);
-+	spi->cur_usedma = false;
-+	return spi->cfg->transfer_one_irq(spi);
- }
- 
- /**
-- * stm32_spi_transfer_one_setup - common setup to transfer a single
-- *				  spi_transfer either using DMA or
-- *				  interrupts.
-+ * stm32f4_spi_set_bpw - Configure bits per word
-+ * @spi: pointer to the spi controller data structure
-  */
--static int stm32_spi_transfer_one_setup(struct stm32_spi *spi,
--					struct spi_device *spi_dev,
--					struct spi_transfer *transfer)
-+static void stm32f4_spi_set_bpw(struct stm32_spi *spi)
- {
--	unsigned long flags;
--	u32 cfg1_clrb = 0, cfg1_setb = 0, cfg2_clrb = 0, cfg2_setb = 0;
--	u32 mode, nb_words;
--	int ret = 0;
--
--	spin_lock_irqsave(&spi->lock, flags);
-+	if (spi->cur_bpw == 16)
-+		stm32_spi_set_bits(spi, STM32F4_SPI_CR1, STM32F4_SPI_CR1_DFF);
-+	else
-+		stm32_spi_clr_bits(spi, STM32F4_SPI_CR1, STM32F4_SPI_CR1_DFF);
-+}
- 
--	if (spi->cur_bpw != transfer->bits_per_word) {
--		u32 bpw, fthlv;
-+/**
-+ * stm32h7_spi_set_bpw - configure bits per word
-+ * @spi: pointer to the spi controller data structure
-+ */
-+static void stm32h7_spi_set_bpw(struct stm32_spi *spi)
-+{
-+	u32 bpw, fthlv;
-+	u32 cfg1_clrb = 0, cfg1_setb = 0;
- 
--		spi->cur_bpw = transfer->bits_per_word;
--		bpw = spi->cur_bpw - 1;
-+	bpw = spi->cur_bpw - 1;
- 
--		cfg1_clrb |= SPI_CFG1_DSIZE;
--		cfg1_setb |= (bpw << SPI_CFG1_DSIZE_SHIFT) & SPI_CFG1_DSIZE;
-+	cfg1_clrb |= STM32H7_SPI_CFG1_DSIZE;
-+	cfg1_setb |= (bpw << STM32H7_SPI_CFG1_DSIZE_SHIFT) &
-+		     STM32H7_SPI_CFG1_DSIZE;
- 
--		spi->cur_fthlv = stm32_spi_prepare_fthlv(spi);
--		fthlv = spi->cur_fthlv - 1;
-+	spi->cur_fthlv = stm32h7_spi_prepare_fthlv(spi);
-+	fthlv = spi->cur_fthlv - 1;
- 
--		cfg1_clrb |= SPI_CFG1_FTHLV;
--		cfg1_setb |= (fthlv << SPI_CFG1_FTHLV_SHIFT) & SPI_CFG1_FTHLV;
--	}
-+	cfg1_clrb |= STM32H7_SPI_CFG1_FTHLV;
-+	cfg1_setb |= (fthlv << STM32H7_SPI_CFG1_FTHLV_SHIFT) &
-+		     STM32H7_SPI_CFG1_FTHLV;
- 
--	if (spi->cur_speed != transfer->speed_hz) {
--		int mbr;
-+	writel_relaxed(
-+		(readl_relaxed(spi->base + STM32H7_SPI_CFG1) &
-+		 ~cfg1_clrb) | cfg1_setb,
-+		spi->base + STM32H7_SPI_CFG1);
-+}
- 
--		/* Update spi->cur_speed with real clock speed */
--		mbr = stm32_spi_prepare_mbr(spi, transfer->speed_hz);
--		if (mbr < 0) {
--			ret = mbr;
--			goto out;
--		}
-+/**
-+ * stm32_spi_set_mbr - Configure baud rate divisor in master mode
-+ * @spi: pointer to the spi controller data structure
-+ * @mbrdiv: baud rate divisor value
-+ */
-+static void stm32_spi_set_mbr(struct stm32_spi *spi, u32 mbrdiv)
-+{
-+	u32 clrb = 0, setb = 0;
- 
--		transfer->speed_hz = spi->cur_speed;
-+	clrb |= spi->cfg->regs->br.mask;
-+	setb |= ((u32)mbrdiv << spi->cfg->regs->br.shift) &
-+		spi->cfg->regs->br.mask;
- 
--		cfg1_clrb |= SPI_CFG1_MBR;
--		cfg1_setb |= ((u32)mbr << SPI_CFG1_MBR_SHIFT) & SPI_CFG1_MBR;
--	}
-+	writel_relaxed((readl_relaxed(spi->base + spi->cfg->regs->br.reg) &
-+			~clrb) | setb,
-+		       spi->base + spi->cfg->regs->br.reg);
-+}
- 
--	if (cfg1_clrb || cfg1_setb)
--		writel_relaxed((readl_relaxed(spi->base + STM32_SPI_CFG1) &
--				~cfg1_clrb) | cfg1_setb,
--			       spi->base + STM32_SPI_CFG1);
-+/**
-+ * stm32_spi_communication_type - return transfer communication type
-+ * @spi_dev: pointer to the spi device
-+ * transfer: pointer to spi transfer
-+ */
-+static unsigned int stm32_spi_communication_type(struct spi_device *spi_dev,
-+						 struct spi_transfer *transfer)
-+{
-+	unsigned int type = SPI_FULL_DUPLEX;
- 
--	mode = SPI_FULL_DUPLEX;
- 	if (spi_dev->mode & SPI_3WIRE) { /* MISO/MOSI signals shared */
- 		/*
- 		 * SPI_3WIRE and xfer->tx_buf != NULL and xfer->rx_buf != NULL
--		 * is forbidden und unvalidated by SPI subsystem so depending
-+		 * is forbidden and unvalidated by SPI subsystem so depending
- 		 * on the valid buffer, we can determine the direction of the
- 		 * transfer.
- 		 */
--		mode = SPI_HALF_DUPLEX;
- 		if (!transfer->tx_buf)
--			stm32_spi_clr_bits(spi, STM32_SPI_CR1, SPI_CR1_HDDIR);
--		else if (!transfer->rx_buf)
--			stm32_spi_set_bits(spi, STM32_SPI_CR1, SPI_CR1_HDDIR);
-+			type = SPI_3WIRE_RX;
-+		else
-+			type = SPI_3WIRE_TX;
- 	} else {
- 		if (!transfer->tx_buf)
--			mode = SPI_SIMPLEX_RX;
-+			type = SPI_SIMPLEX_RX;
- 		else if (!transfer->rx_buf)
--			mode = SPI_SIMPLEX_TX;
-+			type = SPI_SIMPLEX_TX;
-+	}
-+
-+	return type;
-+}
-+
-+/**
-+ * stm32f4_spi_set_mode - configure communication mode
-+ * @spi: pointer to the spi controller data structure
-+ * @comm_type: type of communication to configure
-+ */
-+static int stm32f4_spi_set_mode(struct stm32_spi *spi, unsigned int comm_type)
-+{
-+	if (comm_type == SPI_3WIRE_TX || comm_type == SPI_SIMPLEX_TX) {
-+		stm32_spi_set_bits(spi, STM32F4_SPI_CR1,
-+					STM32F4_SPI_CR1_BIDIMODE |
-+					STM32F4_SPI_CR1_BIDIOE);
-+	} else if (comm_type == SPI_FULL_DUPLEX) {
-+		stm32_spi_clr_bits(spi, STM32F4_SPI_CR1,
-+					STM32F4_SPI_CR1_BIDIMODE |
-+					STM32F4_SPI_CR1_BIDIOE);
-+	} else {
-+		return -EINVAL;
- 	}
--	if (spi->cur_comm != mode) {
--		spi->cur_comm = mode;
- 
--		cfg2_clrb |= SPI_CFG2_COMM;
--		cfg2_setb |= (mode << SPI_CFG2_COMM_SHIFT) & SPI_CFG2_COMM;
-+	return 0;
-+}
-+
-+/**
-+ * stm32h7_spi_set_mode - configure communication mode
-+ * @spi: pointer to the spi controller data structure
-+ * @comm_type: type of communication to configure
-+ */
-+static int stm32h7_spi_set_mode(struct stm32_spi *spi, unsigned int comm_type)
-+{
-+	u32 mode;
-+	u32 cfg2_clrb = 0, cfg2_setb = 0;
-+
-+	if (comm_type == SPI_3WIRE_RX) {
-+		mode = STM32H7_SPI_HALF_DUPLEX;
-+		stm32_spi_clr_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_HDDIR);
-+	} else if (comm_type == SPI_3WIRE_TX) {
-+		mode = STM32H7_SPI_HALF_DUPLEX;
-+		stm32_spi_set_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_HDDIR);
-+	} else if (comm_type == SPI_SIMPLEX_RX) {
-+		mode = STM32H7_SPI_SIMPLEX_RX;
-+	} else if (comm_type == SPI_SIMPLEX_TX) {
-+		mode = STM32H7_SPI_SIMPLEX_TX;
-+	} else {
-+		mode = STM32H7_SPI_FULL_DUPLEX;
- 	}
- 
--	cfg2_clrb |= SPI_CFG2_MIDI;
--	if ((transfer->len > 1) && (spi->cur_midi > 0)) {
-+	cfg2_clrb |= STM32H7_SPI_CFG2_COMM;
-+	cfg2_setb |= (mode << STM32H7_SPI_CFG2_COMM_SHIFT) &
-+		     STM32H7_SPI_CFG2_COMM;
-+
-+	writel_relaxed(
-+		(readl_relaxed(spi->base + STM32H7_SPI_CFG2) &
-+		 ~cfg2_clrb) | cfg2_setb,
-+		spi->base + STM32H7_SPI_CFG2);
-+
-+	return 0;
-+}
-+
-+/**
-+ * stm32h7_spi_data_idleness - configure minimum time delay inserted between two
-+ *			       consecutive data frames in master mode
-+ * @spi: pointer to the spi controller data structure
-+ * @len: transfer len
-+ */
-+static void stm32h7_spi_data_idleness(struct stm32_spi *spi, u32 len)
-+{
-+	u32 cfg2_clrb = 0, cfg2_setb = 0;
-+
-+	cfg2_clrb |= STM32H7_SPI_CFG2_MIDI;
-+	if ((len > 1) && (spi->cur_midi > 0)) {
- 		u32 sck_period_ns = DIV_ROUND_UP(SPI_1HZ_NS, spi->cur_speed);
- 		u32 midi = min((u32)DIV_ROUND_UP(spi->cur_midi, sck_period_ns),
--			       (u32)SPI_CFG2_MIDI >> SPI_CFG2_MIDI_SHIFT);
-+			       (u32)STM32H7_SPI_CFG2_MIDI >>
-+			       STM32H7_SPI_CFG2_MIDI_SHIFT);
- 
- 		dev_dbg(spi->dev, "period=%dns, midi=%d(=%dns)\n",
- 			sck_period_ns, midi, midi * sck_period_ns);
-+		cfg2_setb |= (midi << STM32H7_SPI_CFG2_MIDI_SHIFT) &
-+			     STM32H7_SPI_CFG2_MIDI;
-+	}
-+
-+	writel_relaxed((readl_relaxed(spi->base + STM32H7_SPI_CFG2) &
-+			~cfg2_clrb) | cfg2_setb,
-+		       spi->base + STM32H7_SPI_CFG2);
-+}
-+
-+/**
-+ * stm32h7_spi_number_of_data - configure number of data at current transfer
-+ * @spi: pointer to the spi controller data structure
-+ * @len: transfer length
-+ */
-+static int stm32h7_spi_number_of_data(struct stm32_spi *spi, u32 nb_words)
-+{
-+	u32 cr2_clrb = 0, cr2_setb = 0;
-+
-+	if (nb_words <= (STM32H7_SPI_CR2_TSIZE >>
-+			 STM32H7_SPI_CR2_TSIZE_SHIFT)) {
-+		cr2_clrb |= STM32H7_SPI_CR2_TSIZE;
-+		cr2_setb = nb_words << STM32H7_SPI_CR2_TSIZE_SHIFT;
-+		writel_relaxed((readl_relaxed(spi->base + STM32H7_SPI_CR2) &
-+				~cr2_clrb) | cr2_setb,
-+			       spi->base + STM32H7_SPI_CR2);
-+	} else {
-+		return -EMSGSIZE;
-+	}
-+
-+	return 0;
-+}
-+
-+/**
-+ * stm32_spi_transfer_one_setup - common setup to transfer a single
-+ *				  spi_transfer either using DMA or
-+ *				  interrupts.
-+ */
-+static int stm32_spi_transfer_one_setup(struct stm32_spi *spi,
-+					struct spi_device *spi_dev,
-+					struct spi_transfer *transfer)
-+{
-+	unsigned long flags;
-+	unsigned int comm_type;
-+	int nb_words, ret = 0;
-+
-+	spin_lock_irqsave(&spi->lock, flags);
-+
-+	if (spi->cur_bpw != transfer->bits_per_word) {
-+		spi->cur_bpw = transfer->bits_per_word;
-+		spi->cfg->set_bpw(spi);
-+	}
- 
--		cfg2_setb |= (midi << SPI_CFG2_MIDI_SHIFT) & SPI_CFG2_MIDI;
-+	if (spi->cur_speed != transfer->speed_hz) {
-+		int mbr;
-+
-+		/* Update spi->cur_speed with real clock speed */
-+		mbr = stm32_spi_prepare_mbr(spi, transfer->speed_hz,
-+					    spi->cfg->baud_rate_div_min,
-+					    spi->cfg->baud_rate_div_max);
-+		if (mbr < 0) {
-+			ret = mbr;
-+			goto out;
-+		}
-+
-+		transfer->speed_hz = spi->cur_speed;
-+		stm32_spi_set_mbr(spi, mbr);
- 	}
- 
--	if (cfg2_clrb || cfg2_setb)
--		writel_relaxed((readl_relaxed(spi->base + STM32_SPI_CFG2) &
--				~cfg2_clrb) | cfg2_setb,
--			       spi->base + STM32_SPI_CFG2);
-+	comm_type = stm32_spi_communication_type(spi_dev, transfer);
-+	if (spi->cur_comm != comm_type) {
-+		ret = spi->cfg->set_mode(spi, comm_type);
-+
-+		if (ret < 0)
-+			goto out;
-+
-+		spi->cur_comm = comm_type;
-+	}
-+
-+	if (spi->cfg->set_data_idleness)
-+		spi->cfg->set_data_idleness(spi, transfer->len);
- 
- 	if (spi->cur_bpw <= 8)
- 		nb_words = transfer->len;
-@@ -950,13 +1621,11 @@ static int stm32_spi_transfer_one_setup(struct stm32_spi *spi,
- 		nb_words = DIV_ROUND_UP(transfer->len * 8, 16);
- 	else
- 		nb_words = DIV_ROUND_UP(transfer->len * 8, 32);
--	nb_words <<= SPI_CR2_TSIZE_SHIFT;
- 
--	if (nb_words <= SPI_CR2_TSIZE) {
--		writel_relaxed(nb_words, spi->base + STM32_SPI_CR2);
--	} else {
--		ret = -EMSGSIZE;
--		goto out;
-+	if (spi->cfg->set_number_of_data) {
-+		ret = spi->cfg->set_number_of_data(spi, nb_words);
-+		if (ret < 0)
-+			goto out;
- 	}
- 
- 	spi->cur_xferlen = transfer->len;
-@@ -997,7 +1666,7 @@ static int stm32_spi_transfer_one(struct spi_master *master,
- 	spi->rx_len = spi->rx_buf ? transfer->len : 0;
- 
- 	spi->cur_usedma = (master->can_dma &&
--			   stm32_spi_can_dma(master, spi_dev, transfer));
-+			   master->can_dma(master, spi_dev, transfer));
- 
- 	ret = stm32_spi_transfer_one_setup(spi, spi_dev, transfer);
- 	if (ret) {
-@@ -1008,47 +1677,73 @@ static int stm32_spi_transfer_one(struct spi_master *master,
- 	if (spi->cur_usedma)
- 		return stm32_spi_transfer_one_dma(spi, transfer);
- 	else
--		return stm32_spi_transfer_one_irq(spi);
-+		return spi->cfg->transfer_one_irq(spi);
- }
- 
- /**
-  * stm32_spi_unprepare_msg - relax the hardware
-- *
-- * Normally, if TSIZE has been configured, we should relax the hardware at the
-- * reception of the EOT interrupt. But in case of error, EOT will not be
-- * raised. So the subsystem unprepare_message call allows us to properly
-- * complete the transfer from an hardware point of view.
-  */
- static int stm32_spi_unprepare_msg(struct spi_master *master,
- 				   struct spi_message *msg)
- {
- 	struct stm32_spi *spi = spi_master_get_devdata(master);
- 
--	stm32_spi_disable(spi);
-+	spi->cfg->disable(spi);
-+
-+	return 0;
-+}
-+
-+/**
-+ * stm32f4_spi_config - Configure SPI controller as SPI master
-+ */
-+static int stm32f4_spi_config(struct stm32_spi *spi)
-+{
-+	unsigned long flags;
-+
-+	spin_lock_irqsave(&spi->lock, flags);
-+
-+	/* Ensure I2SMOD bit is kept cleared */
-+	stm32_spi_clr_bits(spi, STM32F4_SPI_I2SCFGR,
-+			   STM32F4_SPI_I2SCFGR_I2SMOD);
-+
-+	/*
-+	 * - SS input value high
-+	 * - transmitter half duplex direction
-+	 * - Set the master mode (default Motorola mode)
-+	 * - Consider 1 master/n slaves configuration and
-+	 *   SS input value is determined by the SSI bit
-+	 */
-+	stm32_spi_set_bits(spi, STM32F4_SPI_CR1, STM32F4_SPI_CR1_SSI |
-+						 STM32F4_SPI_CR1_BIDIOE |
-+						 STM32F4_SPI_CR1_MSTR |
-+						 STM32F4_SPI_CR1_SSM);
-+
-+	spin_unlock_irqrestore(&spi->lock, flags);
- 
- 	return 0;
- }
- 
- /**
-- * stm32_spi_config - Configure SPI controller as SPI master
-+ * stm32h7_spi_config - Configure SPI controller as SPI master
-  */
--static int stm32_spi_config(struct stm32_spi *spi)
-+static int stm32h7_spi_config(struct stm32_spi *spi)
- {
- 	unsigned long flags;
- 
- 	spin_lock_irqsave(&spi->lock, flags);
- 
- 	/* Ensure I2SMOD bit is kept cleared */
--	stm32_spi_clr_bits(spi, STM32_SPI_I2SCFGR, SPI_I2SCFGR_I2SMOD);
-+	stm32_spi_clr_bits(spi, STM32H7_SPI_I2SCFGR,
-+			   STM32H7_SPI_I2SCFGR_I2SMOD);
- 
- 	/*
- 	 * - SS input value high
- 	 * - transmitter half duplex direction
- 	 * - automatic communication suspend when RX-Fifo is full
- 	 */
--	stm32_spi_set_bits(spi, STM32_SPI_CR1, SPI_CR1_SSI |
--					       SPI_CR1_HDDIR |
--					       SPI_CR1_MASRX);
-+	stm32_spi_set_bits(spi, STM32H7_SPI_CR1, STM32H7_SPI_CR1_SSI |
-+						 STM32H7_SPI_CR1_HDDIR |
-+						 STM32H7_SPI_CR1_MASRX);
- 
- 	/*
- 	 * - Set the master mode (default Motorola mode)
-@@ -1056,17 +1751,56 @@ static int stm32_spi_config(struct stm32_spi *spi)
- 	 *   SS input value is determined by the SSI bit
- 	 * - keep control of all associated GPIOs
- 	 */
--	stm32_spi_set_bits(spi, STM32_SPI_CFG2, SPI_CFG2_MASTER |
--						SPI_CFG2_SSM |
--						SPI_CFG2_AFCNTR);
-+	stm32_spi_set_bits(spi, STM32H7_SPI_CFG2, STM32H7_SPI_CFG2_MASTER |
-+						  STM32H7_SPI_CFG2_SSM |
-+						  STM32H7_SPI_CFG2_AFCNTR);
- 
- 	spin_unlock_irqrestore(&spi->lock, flags);
- 
- 	return 0;
- }
- 
-+static const struct stm32_spi_cfg stm32f4_spi_cfg = {
-+	.regs = &stm32f4_spi_regspec,
-+	.get_bpw_mask = stm32f4_spi_get_bpw_mask,
-+	.disable = stm32f4_spi_disable,
-+	.config = stm32f4_spi_config,
-+	.set_bpw = stm32f4_spi_set_bpw,
-+	.set_mode = stm32f4_spi_set_mode,
-+	.transfer_one_dma_start = stm32f4_spi_transfer_one_dma_start,
-+	.dma_tx_cb = stm32f4_spi_dma_tx_cb,
-+	.dma_rx_cb = stm32f4_spi_dma_rx_cb,
-+	.transfer_one_irq = stm32f4_spi_transfer_one_irq,
-+	.irq_handler_event = stm32f4_spi_irq_event,
-+	.irq_handler_thread = stm32f4_spi_irq_thread,
-+	.baud_rate_div_min = STM32F4_SPI_BR_DIV_MIN,
-+	.baud_rate_div_max = STM32F4_SPI_BR_DIV_MAX,
-+	.has_fifo = false,
-+};
-+
-+static const struct stm32_spi_cfg stm32h7_spi_cfg = {
-+	.regs = &stm32h7_spi_regspec,
-+	.get_fifo_size = stm32h7_spi_get_fifo_size,
-+	.get_bpw_mask = stm32h7_spi_get_bpw_mask,
-+	.disable = stm32h7_spi_disable,
-+	.config = stm32h7_spi_config,
-+	.set_bpw = stm32h7_spi_set_bpw,
-+	.set_mode = stm32h7_spi_set_mode,
-+	.set_data_idleness = stm32h7_spi_data_idleness,
-+	.set_number_of_data = stm32h7_spi_number_of_data,
-+	.transfer_one_dma_start = stm32h7_spi_transfer_one_dma_start,
-+	.dma_rx_cb = stm32h7_spi_dma_cb,
-+	.dma_tx_cb = stm32h7_spi_dma_cb,
-+	.transfer_one_irq = stm32h7_spi_transfer_one_irq,
-+	.irq_handler_thread = stm32h7_spi_irq_thread,
-+	.baud_rate_div_min = STM32H7_SPI_MBR_DIV_MIN,
-+	.baud_rate_div_max = STM32H7_SPI_MBR_DIV_MAX,
-+	.has_fifo = true,
-+};
-+
- static const struct of_device_id stm32_spi_of_match[] = {
--	{ .compatible = "st,stm32h7-spi", },
-+	{ .compatible = "st,stm32h7-spi", .data = (void *)&stm32h7_spi_cfg },
-+	{ .compatible = "st,stm32f4-spi", .data = (void *)&stm32f4_spi_cfg },
- 	{},
- };
- MODULE_DEVICE_TABLE(of, stm32_spi_of_match);
-@@ -1090,12 +1824,17 @@ static int stm32_spi_probe(struct platform_device *pdev)
- 	spi->master = master;
- 	spin_lock_init(&spi->lock);
- 
-+	spi->cfg = (const struct stm32_spi_cfg *)
-+		of_match_device(pdev->dev.driver->of_match_table,
-+				&pdev->dev)->data;
-+
- 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- 	spi->base = devm_ioremap_resource(&pdev->dev, res);
- 	if (IS_ERR(spi->base)) {
- 		ret = PTR_ERR(spi->base);
- 		goto err_master_put;
- 	}
-+
- 	spi->phys_addr = (dma_addr_t)res->start;
- 
- 	spi->irq = platform_get_irq(pdev, 0);
-@@ -1104,16 +1843,17 @@ static int stm32_spi_probe(struct platform_device *pdev)
- 		ret = -ENOENT;
- 		goto err_master_put;
- 	}
--	ret = devm_request_threaded_irq(&pdev->dev, spi->irq, NULL,
--					stm32_spi_irq, IRQF_ONESHOT,
--					pdev->name, master);
-+	ret = devm_request_threaded_irq(&pdev->dev, spi->irq,
-+					spi->cfg->irq_handler_event,
-+					spi->cfg->irq_handler_thread,
-+					IRQF_ONESHOT, pdev->name, master);
- 	if (ret) {
- 		dev_err(&pdev->dev, "irq%d request failed: %d\n", spi->irq,
- 			ret);
- 		goto err_master_put;
- 	}
- 
--	spi->clk = devm_clk_get(&pdev->dev, 0);
-+	spi->clk = devm_clk_get(&pdev->dev, NULL);
- 	if (IS_ERR(spi->clk)) {
- 		ret = PTR_ERR(spi->clk);
- 		dev_err(&pdev->dev, "clk get failed: %d\n", ret);
-@@ -1139,9 +1879,10 @@ static int stm32_spi_probe(struct platform_device *pdev)
- 		reset_control_deassert(spi->rst);
- 	}
- 
--	spi->fifo_size = stm32_spi_get_fifo_size(spi);
-+	if (spi->cfg->has_fifo)
-+		spi->fifo_size = spi->cfg->get_fifo_size(spi);
- 
--	ret = stm32_spi_config(spi);
-+	ret = spi->cfg->config(spi);
- 	if (ret) {
- 		dev_err(&pdev->dev, "controller configuration failed: %d\n",
- 			ret);
-@@ -1151,11 +1892,11 @@ static int stm32_spi_probe(struct platform_device *pdev)
- 	master->dev.of_node = pdev->dev.of_node;
- 	master->auto_runtime_pm = true;
- 	master->bus_num = pdev->id;
--	master->mode_bits = SPI_MODE_3 | SPI_CS_HIGH | SPI_LSB_FIRST |
--			    SPI_3WIRE | SPI_LOOP;
--	master->bits_per_word_mask = stm32_spi_get_bpw_mask(spi);
--	master->max_speed_hz = spi->clk_rate / SPI_MBR_DIV_MIN;
--	master->min_speed_hz = spi->clk_rate / SPI_MBR_DIV_MAX;
-+	master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_CS_HIGH | SPI_LSB_FIRST |
-+			    SPI_3WIRE;
-+	master->bits_per_word_mask = spi->cfg->get_bpw_mask(spi);
-+	master->max_speed_hz = spi->clk_rate / spi->cfg->baud_rate_div_min;
-+	master->min_speed_hz = spi->clk_rate / spi->cfg->baud_rate_div_max;
- 	master->setup = stm32_spi_setup;
- 	master->prepare_message = stm32_spi_prepare_msg;
- 	master->transfer_one = stm32_spi_transfer_one;
-@@ -1233,7 +1974,7 @@ static int stm32_spi_remove(struct platform_device *pdev)
- 	struct spi_master *master = platform_get_drvdata(pdev);
- 	struct stm32_spi *spi = spi_master_get_devdata(master);
- 
--	stm32_spi_disable(spi);
-+	spi->cfg->disable(spi);
- 
- 	if (master->dma_tx)
- 		dma_release_channel(master->dma_tx);
-diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c
-index 5f19016bbf10..b9fb6493cd6b 100644
---- a/drivers/spi/spi-ti-qspi.c
-+++ b/drivers/spi/spi-ti-qspi.c
-@@ -490,8 +490,8 @@ static void ti_qspi_enable_memory_map(struct spi_device *spi)
- 	ti_qspi_write(qspi, MM_SWITCH, QSPI_SPI_SWITCH_REG);
- 	if (qspi->ctrl_base) {
- 		regmap_update_bits(qspi->ctrl_base, qspi->ctrl_reg,
--				   MEM_CS_EN(spi->chip_select),
--				   MEM_CS_MASK);
-+				   MEM_CS_MASK,
-+				   MEM_CS_EN(spi->chip_select));
- 	}
- 	qspi->mmap_enabled = true;
- }
-@@ -503,7 +503,7 @@ static void ti_qspi_disable_memory_map(struct spi_device *spi)
- 	ti_qspi_write(qspi, 0, QSPI_SPI_SWITCH_REG);
- 	if (qspi->ctrl_base)
- 		regmap_update_bits(qspi->ctrl_base, qspi->ctrl_reg,
--				   0, MEM_CS_MASK);
-+				   MEM_CS_MASK, 0);
- 	qspi->mmap_enabled = false;
- }
- 
-diff --git a/drivers/spi/spi-topcliff-pch.c b/drivers/spi/spi-topcliff-pch.c
-index 97d137591b18..e7e8ea1edcce 100644
---- a/drivers/spi/spi-topcliff-pch.c
-+++ b/drivers/spi/spi-topcliff-pch.c
-@@ -1008,6 +1008,9 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw)
- 
- 	/* RX */
- 	dma->sg_rx_p = kcalloc(num, sizeof(*dma->sg_rx_p), GFP_ATOMIC);
-+	if (!dma->sg_rx_p)
-+		return;
-+
- 	sg_init_table(dma->sg_rx_p, num); /* Initialize SG table */
- 	/* offset, length setting */
- 	sg = dma->sg_rx_p;
-@@ -1068,6 +1071,9 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw)
- 	}
- 
- 	dma->sg_tx_p = kcalloc(num, sizeof(*dma->sg_tx_p), GFP_ATOMIC);
-+	if (!dma->sg_tx_p)
-+		return;
-+
- 	sg_init_table(dma->sg_tx_p, num); /* Initialize SG table */
- 	/* offset, length setting */
- 	sg = dma->sg_tx_p;
-diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
-index 9a7def7c3237..93986f879b09 100644
---- a/drivers/spi/spi.c
-+++ b/drivers/spi/spi.c
-@@ -19,6 +19,7 @@
- #include <linux/spi/spi.h>
- #include <linux/spi/spi-mem.h>
- #include <linux/of_gpio.h>
-+#include <linux/gpio/consumer.h>
- #include <linux/pm_runtime.h>
- #include <linux/pm_domain.h>
- #include <linux/property.h>
-@@ -578,7 +579,10 @@ int spi_add_device(struct spi_device *spi)
- 		goto done;
- 	}
- 
--	if (ctlr->cs_gpios)
-+	/* Descriptors take precedence */
-+	if (ctlr->cs_gpiods)
-+		spi->cs_gpiod = ctlr->cs_gpiods[spi->chip_select];
-+	else if (ctlr->cs_gpios)
- 		spi->cs_gpio = ctlr->cs_gpios[spi->chip_select];
- 
- 	/* Drivers may modify this initial i/o setup, but will
-@@ -772,10 +776,21 @@ static void spi_set_cs(struct spi_device *spi, bool enable)
- 	if (spi->mode & SPI_CS_HIGH)
- 		enable = !enable;
- 
--	if (gpio_is_valid(spi->cs_gpio)) {
--		/* Honour the SPI_NO_CS flag */
--		if (!(spi->mode & SPI_NO_CS))
--			gpio_set_value(spi->cs_gpio, !enable);
-+	if (spi->cs_gpiod || gpio_is_valid(spi->cs_gpio)) {
-+		/*
-+		 * Honour the SPI_NO_CS flag and invert the enable line, as
-+		 * active low is default for SPI. Execution paths that handle
-+		 * polarity inversion in gpiolib (such as device tree) will
-+		 * enforce active high using the SPI_CS_HIGH resulting in a
-+		 * double inversion through the code above.
-+		 */
-+		if (!(spi->mode & SPI_NO_CS)) {
-+			if (spi->cs_gpiod)
-+				gpiod_set_value_cansleep(spi->cs_gpiod,
-+							 !enable);
-+			else
-+				gpio_set_value_cansleep(spi->cs_gpio, !enable);
-+		}
- 		/* Some SPI masters need both GPIO CS & slave_select */
- 		if ((spi->controller->flags & SPI_MASTER_GPIO_SS) &&
- 		    spi->controller->set_cs)
-@@ -1615,13 +1630,21 @@ static int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi,
- 		spi->mode |= SPI_CPHA;
- 	if (of_property_read_bool(nc, "spi-cpol"))
- 		spi->mode |= SPI_CPOL;
--	if (of_property_read_bool(nc, "spi-cs-high"))
--		spi->mode |= SPI_CS_HIGH;
- 	if (of_property_read_bool(nc, "spi-3wire"))
- 		spi->mode |= SPI_3WIRE;
- 	if (of_property_read_bool(nc, "spi-lsb-first"))
- 		spi->mode |= SPI_LSB_FIRST;
- 
-+	/*
-+	 * For descriptors associated with the device, polarity inversion is
-+	 * handled in the gpiolib, so all chip selects are "active high" in
-+	 * the logical sense, the gpiolib will invert the line if need be.
-+	 */
-+	if (ctlr->use_gpio_descriptors)
-+		spi->mode |= SPI_CS_HIGH;
-+	else if (of_property_read_bool(nc, "spi-cs-high"))
-+		spi->mode |= SPI_CS_HIGH;
-+
- 	/* Device DUAL/QUAD mode */
- 	if (!of_property_read_u32(nc, "spi-tx-bus-width", &value)) {
- 		switch (value) {
-@@ -2137,6 +2160,60 @@ static int of_spi_register_master(struct spi_controller *ctlr)
- }
- #endif
- 
-+/**
-+ * spi_get_gpio_descs() - grab chip select GPIOs for the master
-+ * @ctlr: The SPI master to grab GPIO descriptors for
-+ */
-+static int spi_get_gpio_descs(struct spi_controller *ctlr)
-+{
-+	int nb, i;
-+	struct gpio_desc **cs;
-+	struct device *dev = &ctlr->dev;
-+
-+	nb = gpiod_count(dev, "cs");
-+	ctlr->num_chipselect = max_t(int, nb, ctlr->num_chipselect);
-+
-+	/* No GPIOs at all is fine, else return the error */
-+	if (nb == 0 || nb == -ENOENT)
-+		return 0;
-+	else if (nb < 0)
-+		return nb;
-+
-+	cs = devm_kcalloc(dev, ctlr->num_chipselect, sizeof(*cs),
-+			  GFP_KERNEL);
-+	if (!cs)
-+		return -ENOMEM;
-+	ctlr->cs_gpiods = cs;
-+
-+	for (i = 0; i < nb; i++) {
-+		/*
-+		 * Most chipselects are active low, the inverted
-+		 * semantics are handled by special quirks in gpiolib,
-+		 * so initializing them GPIOD_OUT_LOW here means
-+		 * "unasserted", in most cases this will drive the physical
-+		 * line high.
-+		 */
-+		cs[i] = devm_gpiod_get_index_optional(dev, "cs", i,
-+						      GPIOD_OUT_LOW);
-+
-+		if (cs[i]) {
-+			/*
-+			 * If we find a CS GPIO, name it after the device and
-+			 * chip select line.
-+			 */
-+			char *gpioname;
-+
-+			gpioname = devm_kasprintf(dev, GFP_KERNEL, "%s CS%d",
-+						  dev_name(dev), i);
-+			if (!gpioname)
-+				return -ENOMEM;
-+			gpiod_set_consumer_name(cs[i], gpioname);
-+		}
-+	}
-+
-+	return 0;
-+}
-+
- static int spi_controller_check_ops(struct spi_controller *ctlr)
- {
- 	/*
-@@ -2199,9 +2276,21 @@ int spi_register_controller(struct spi_controller *ctlr)
- 		return status;
- 
- 	if (!spi_controller_is_slave(ctlr)) {
--		status = of_spi_register_master(ctlr);
--		if (status)
--			return status;
-+		if (ctlr->use_gpio_descriptors) {
-+			status = spi_get_gpio_descs(ctlr);
-+			if (status)
-+				return status;
-+			/*
-+			 * A controller using GPIO descriptors always
-+			 * supports SPI_CS_HIGH if need be.
-+			 */
-+			ctlr->mode_bits |= SPI_CS_HIGH;
-+		} else {
-+			/* Legacy code path for GPIOs from DT */
-+			status = of_spi_register_master(ctlr);
-+			if (status)
-+				return status;
-+		}
- 	}
- 
- 	/* even if it's just one always-selected device, there must
-@@ -2915,6 +3004,7 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)
- 	 * cs_change is set for each transfer.
- 	 */
- 	if ((spi->mode & SPI_CS_WORD) && (!(ctlr->mode_bits & SPI_CS_WORD) ||
-+					  spi->cs_gpiod ||
- 					  gpio_is_valid(spi->cs_gpio))) {
- 		size_t maxsize;
- 		int ret;
-@@ -2961,6 +3051,8 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)
- 	 * it is not set for this transfer.
- 	 * Set transfer tx_nbits and rx_nbits as single transfer default
- 	 * (SPI_NBITS_SINGLE) if it is not set for this transfer.
-+	 * Ensure transfer word_delay is at least as long as that required by
-+	 * device itself.
- 	 */
- 	message->frame_length = 0;
- 	list_for_each_entry(xfer, &message->transfers, transfer_list) {
-@@ -3031,6 +3123,9 @@ static int __spi_validate(struct spi_device *spi, struct spi_message *message)
- 				!(spi->mode & SPI_RX_QUAD))
- 				return -EINVAL;
- 		}
-+
-+		if (xfer->word_delay_usecs < spi->word_delay_usecs)
-+			xfer->word_delay_usecs = spi->word_delay_usecs;
- 	}
- 
- 	message->status = -EINPROGRESS;
-diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
-index b0c76e2626ce..70966e10be7e 100644
---- a/drivers/spi/spidev.c
-+++ b/drivers/spi/spidev.c
-@@ -276,17 +276,19 @@ static int spidev_message(struct spidev_data *spidev,
- 		k_tmp->bits_per_word = u_tmp->bits_per_word;
- 		k_tmp->delay_usecs = u_tmp->delay_usecs;
- 		k_tmp->speed_hz = u_tmp->speed_hz;
-+		k_tmp->word_delay_usecs = u_tmp->word_delay_usecs;
- 		if (!k_tmp->speed_hz)
- 			k_tmp->speed_hz = spidev->speed_hz;
- #ifdef VERBOSE
- 		dev_dbg(&spidev->spi->dev,
--			"  xfer len %u %s%s%s%dbits %u usec %uHz\n",
-+			"  xfer len %u %s%s%s%dbits %u usec %u usec %uHz\n",
- 			u_tmp->len,
- 			u_tmp->rx_buf ? "rx " : "",
- 			u_tmp->tx_buf ? "tx " : "",
- 			u_tmp->cs_change ? "cs " : "",
- 			u_tmp->bits_per_word ? : spidev->spi->bits_per_word,
- 			u_tmp->delay_usecs,
-+			u_tmp->word_delay_usecs,
- 			u_tmp->speed_hz ? : spidev->spi->max_speed_hz);
- #endif
- 		spi_message_add_tail(k_tmp, &msg);
 diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
-index 4f479841769a..305086b8208a 100644
+index 8434bd5a8ec7..59d3c27d36a2 100644
 --- a/drivers/tty/serial/max310x.c
 +++ b/drivers/tty/serial/max310x.c
-@@ -248,6 +248,7 @@
- struct max310x_devtype {
- 	char	name[9];
- 	int	nr;
-+	u8	mode1;
- 	int	(*detect)(struct device *);
- 	void	(*power)(struct uart_port *, int);
- };
-@@ -410,6 +411,7 @@ static void max14830_power(struct uart_port *port, int on)
- static const struct max310x_devtype max3107_devtype = {
- 	.name	= "MAX3107",
- 	.nr	= 1,
-+	.mode1	= MAX310X_MODE1_AUTOSLEEP_BIT | MAX310X_MODE1_IRQSEL_BIT,
- 	.detect	= max3107_detect,
- 	.power	= max310x_power,
- };
-@@ -417,6 +419,7 @@ static const struct max310x_devtype max3107_devtype = {
- static const struct max310x_devtype max3108_devtype = {
- 	.name	= "MAX3108",
- 	.nr	= 1,
-+	.mode1	= MAX310X_MODE1_AUTOSLEEP_BIT,
- 	.detect	= max3108_detect,
- 	.power	= max310x_power,
- };
-@@ -424,6 +427,7 @@ static const struct max310x_devtype max3108_devtype = {
- static const struct max310x_devtype max3109_devtype = {
- 	.name	= "MAX3109",
- 	.nr	= 2,
-+	.mode1	= MAX310X_MODE1_AUTOSLEEP_BIT,
- 	.detect	= max3109_detect,
- 	.power	= max310x_power,
- };
-@@ -431,6 +435,7 @@ static const struct max310x_devtype max3109_devtype = {
- static const struct max310x_devtype max14830_devtype = {
- 	.name	= "MAX14830",
- 	.nr	= 4,
-+	.mode1	= MAX310X_MODE1_IRQSEL_BIT,
- 	.detect	= max14830_detect,
- 	.power	= max14830_power,
- };
-@@ -1197,8 +1202,7 @@ static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
- 		return PTR_ERR(regmap);
+@@ -235,6 +235,10 @@
+ #define MAX310x_REV_MASK		(0xf8)
+ #define MAX310X_WRITE_BIT		0x80
  
- 	/* Alloc port structure */
--	s = devm_kzalloc(dev, sizeof(*s) +
--			 sizeof(struct max310x_one) * devtype->nr, GFP_KERNEL);
-+	s = devm_kzalloc(dev, struct_size(s, p, devtype->nr), GFP_KERNEL);
- 	if (!s) {
- 		dev_err(dev, "Error allocating port structure\n");
- 		return -ENOMEM;
-@@ -1258,9 +1262,8 @@ static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
- 				    MAX310X_BRGDIVLSB_REG + offs, &ret);
- 		} while (ret != 0x01);
++/* Timeout for external crystal stability */
++#define MAX310X_XTAL_WAIT_RETRIES	20
++#define MAX310X_XTAL_WAIT_DELAY_MS	10
++
+ /* MAX3107 specific */
+ #define MAX3107_REV_ID			(0xa0)
  
--		regmap_update_bits(s->regmap, MAX310X_MODE1_REG + offs,
--				   MAX310X_MODE1_AUTOSLEEP_BIT,
--				   MAX310X_MODE1_AUTOSLEEP_BIT);
-+		regmap_write(s->regmap, MAX310X_MODE1_REG + offs,
-+			     devtype->mode1);
+@@ -610,11 +614,14 @@ static int max310x_set_ref_clk(struct device *dev, struct max310x_port *s,
+ 
+ 	/* Wait for crystal */
+ 	if (xtal) {
+-		unsigned int val;
+-		msleep(10);
+-		regmap_read(s->regmap, MAX310X_STS_IRQSTS_REG, &val);
++		unsigned int val = 0, i;
++		for (i = 0; i < MAX310X_XTAL_WAIT_RETRIES && !(val & MAX310X_STS_CLKREADY_BIT); ++i) {
++			msleep(MAX310X_XTAL_WAIT_DELAY_MS);
++			regmap_read(s->regmap, MAX310X_STS_IRQSTS_REG, &val);
++		}
+ 		if (!(val & MAX310X_STS_CLKREADY_BIT)) {
+-			dev_warn(dev, "clock is not stable yet\n");
++			dev_err(dev, "clock is not stable\n");
++			return -EAGAIN;
+ 		}
+ 	}
+ 
+@@ -1327,6 +1334,10 @@ static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
  	}
  
  	uartclk = max310x_set_ref_clk(dev, s, freq, xtal);
-@@ -1294,10 +1297,6 @@ static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
- 		max310x_port_write(&s->p[i].port, MAX310X_IRQEN_REG, 0);
- 		/* Clear IRQ status register */
- 		max310x_port_read(&s->p[i].port, MAX310X_IRQSTS_REG);
--		/* Enable IRQ pin */
--		max310x_port_update(&s->p[i].port, MAX310X_MODE1_REG,
--				    MAX310X_MODE1_IRQSEL_BIT,
--				    MAX310X_MODE1_IRQSEL_BIT);
- 		/* Initialize queue for start TX */
- 		INIT_WORK(&s->p[i].tx_work, max310x_wq_proc);
- 		/* Initialize queue for changing LOOPBACK mode */
-diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h
-index 07cddbf45186..92a222646447 100644
---- a/include/linux/gpio/driver.h
-+++ b/include/linux/gpio/driver.h
-@@ -609,6 +609,9 @@ struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum,
- 					    enum gpiod_flags flags);
- void gpiochip_free_own_desc(struct gpio_desc *desc);
++	if (uartclk < 0) {
++		ret = uartclk;
++		goto out_uart;
++	}
+ 	dev_dbg(dev, "Reference clock set to %i Hz\n", uartclk);
  
-+void devprop_gpiochip_set_names(struct gpio_chip *chip,
-+				const struct fwnode_handle *fwnode);
-+
- #else /* CONFIG_GPIOLIB */
- 
- static inline struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc)
-diff --git a/include/linux/platform_data/spi-ath79.h b/include/linux/platform_data/spi-ath79.h
-new file mode 100644
-index 000000000000..aa71216edf99
---- /dev/null
-+++ b/include/linux/platform_data/spi-ath79.h
-@@ -0,0 +1,19 @@
-+/*
-+ *  Platform data definition for Atheros AR71XX/AR724X/AR913X SPI controller
-+ *
-+ *  Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ */
-+
-+#ifndef _ATH79_SPI_PLATFORM_H
-+#define _ATH79_SPI_PLATFORM_H
-+
-+struct ath79_spi_platform_data {
-+	unsigned	bus_num;
-+	unsigned	num_chipselect;
-+};
-+
-+#endif /* _ATH79_SPI_PLATFORM_H */
-diff --git a/include/linux/spi/pxa2xx_spi.h b/include/linux/spi/pxa2xx_spi.h
-index b0674e330ef6..c1c59473cef9 100644
---- a/include/linux/spi/pxa2xx_spi.h
-+++ b/include/linux/spi/pxa2xx_spi.h
-@@ -22,7 +22,7 @@
- struct dma_chan;
- 
- /* device.platform_data for SSP controller devices */
--struct pxa2xx_spi_master {
-+struct pxa2xx_spi_controller {
- 	u16 num_chipselect;
- 	u8 enable_dma;
- 	bool is_slave;
-@@ -54,7 +54,7 @@ struct pxa2xx_spi_chip {
- 
- #include <linux/clk.h>
- 
--extern void pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_master *info);
-+extern void pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_controller *info);
- 
- #endif
- #endif
-diff --git a/include/linux/spi/spi-mem.h b/include/linux/spi/spi-mem.h
-index 3fe24500c5ee..3703d0dcac2e 100644
---- a/include/linux/spi/spi-mem.h
-+++ b/include/linux/spi/spi-mem.h
-@@ -330,6 +330,11 @@ ssize_t spi_mem_dirmap_read(struct spi_mem_dirmap_desc *desc,
- 			    u64 offs, size_t len, void *buf);
- ssize_t spi_mem_dirmap_write(struct spi_mem_dirmap_desc *desc,
- 			     u64 offs, size_t len, const void *buf);
-+struct spi_mem_dirmap_desc *
-+devm_spi_mem_dirmap_create(struct device *dev, struct spi_mem *mem,
-+			   const struct spi_mem_dirmap_info *info);
-+void devm_spi_mem_dirmap_destroy(struct device *dev,
-+				 struct spi_mem_dirmap_desc *desc);
- 
- int spi_mem_driver_register_with_owner(struct spi_mem_driver *drv,
- 				       struct module *owner);
-diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
-index 314d922ca607..662b336aa2e4 100644
---- a/include/linux/spi/spi.h
-+++ b/include/linux/spi/spi.h
-@@ -12,6 +12,7 @@
- #include <linux/kthread.h>
- #include <linux/completion.h>
- #include <linux/scatterlist.h>
-+#include <linux/gpio/consumer.h>
- 
- struct dma_chan;
- struct property_entry;
-@@ -116,8 +117,13 @@ void spi_statistics_add_transfer_stats(struct spi_statistics *stats,
-  * @modalias: Name of the driver to use with this device, or an alias
-  *	for that name.  This appears in the sysfs "modalias" attribute
-  *	for driver coldplugging, and in uevents used for hotplugging
-- * @cs_gpio: gpio number of the chipselect line (optional, -ENOENT when
-+ * @cs_gpio: LEGACY: gpio number of the chipselect line (optional, -ENOENT when
-+ *	not using a GPIO line) use cs_gpiod in new drivers by opting in on
-+ *	the spi_master.
-+ * @cs_gpiod: gpio descriptor of the chipselect line (optional, NULL when
-  *	not using a GPIO line)
-+ * @word_delay_usecs: microsecond delay to be inserted between consecutive
-+ *	words of a transfer
-  *
-  * @statistics: statistics for the spi_device
-  *
-@@ -163,7 +169,9 @@ struct spi_device {
- 	void			*controller_data;
- 	char			modalias[SPI_NAME_SIZE];
- 	const char		*driver_override;
--	int			cs_gpio;	/* chip select gpio */
-+	int			cs_gpio;	/* LEGACY: chip select gpio */
-+	struct gpio_desc	*cs_gpiod;	/* chip select gpio desc */
-+	uint8_t			word_delay_usecs; /* inter-word delay */
- 
- 	/* the statistics */
- 	struct spi_statistics	statistics;
-@@ -376,9 +384,17 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)
-  *	     controller has native support for memory like operations.
-  * @unprepare_message: undo any work done by prepare_message().
-  * @slave_abort: abort the ongoing transfer request on an SPI slave controller
-- * @cs_gpios: Array of GPIOs to use as chip select lines; one per CS
-- *	number. Any individual value may be -ENOENT for CS lines that
-+ * @cs_gpios: LEGACY: array of GPIO descs to use as chip select lines; one per
-+ *	CS number. Any individual value may be -ENOENT for CS lines that
-+ *	are not GPIOs (driven by the SPI controller itself). Use the cs_gpiods
-+ *	in new drivers.
-+ * @cs_gpiods: Array of GPIO descs to use as chip select lines; one per CS
-+ *	number. Any individual value may be NULL for CS lines that
-  *	are not GPIOs (driven by the SPI controller itself).
-+ * @use_gpio_descriptors: Turns on the code in the SPI core to parse and grab
-+ *	GPIO descriptors rather than using global GPIO numbers grabbed by the
-+ *	driver. This will fill in @cs_gpiods and @cs_gpios should not be used,
-+ *	and SPI devices will have the cs_gpiod assigned rather than cs_gpio.
-  * @statistics: statistics for the spi_controller
-  * @dma_tx: DMA transmit channel
-  * @dma_rx: DMA receive channel
-@@ -557,6 +573,8 @@ struct spi_controller {
- 
- 	/* gpio chip select */
- 	int			*cs_gpios;
-+	struct gpio_desc	**cs_gpiods;
-+	bool			use_gpio_descriptors;
- 
- 	/* statistics */
- 	struct spi_statistics	statistics;
-@@ -706,6 +724,8 @@ extern void spi_res_release(struct spi_controller *ctlr,
-  * @delay_usecs: microseconds to delay after this transfer before
-  *	(optionally) changing the chipselect status, then starting
-  *	the next transfer or completing this @spi_message.
-+ * @word_delay_usecs: microseconds to inter word delay after each word size
-+ *	(set by bits_per_word) transmission.
-  * @word_delay: clock cycles to inter word delay after each word size
-  *	(set by bits_per_word) transmission.
-  * @transfer_list: transfers are sequenced through @spi_message.transfers
-@@ -788,6 +808,7 @@ struct spi_transfer {
- #define	SPI_NBITS_DUAL		0x02 /* 2bits transfer */
- #define	SPI_NBITS_QUAD		0x04 /* 4bits transfer */
- 	u8		bits_per_word;
-+	u8		word_delay_usecs;
- 	u16		delay_usecs;
- 	u32		speed_hz;
- 	u16		word_delay;
-diff --git a/include/trace/events/spi.h b/include/trace/events/spi.h
-index 277bb9d25779..aef6869f563d 100644
---- a/include/trace/events/spi.h
-+++ b/include/trace/events/spi.h
-@@ -109,6 +109,16 @@ TRACE_EVENT(spi_message_done,
-                   (unsigned)__entry->actual, (unsigned)__entry->frame)
- );
- 
-+/*
-+ * consider a buffer valid if non-NULL and if it doesn't match the dummy buffer
-+ * that only exist to work with controllers that have SPI_CONTROLLER_MUST_TX or
-+ * SPI_CONTROLLER_MUST_RX.
-+ */
-+#define spi_valid_txbuf(msg, xfer) \
-+	(xfer->tx_buf && xfer->tx_buf != msg->spi->controller->dummy_tx)
-+#define spi_valid_rxbuf(msg, xfer) \
-+	(xfer->rx_buf && xfer->rx_buf != msg->spi->controller->dummy_rx)
-+
- DECLARE_EVENT_CLASS(spi_transfer,
- 
- 	TP_PROTO(struct spi_message *msg, struct spi_transfer *xfer),
-@@ -120,6 +130,10 @@ DECLARE_EVENT_CLASS(spi_transfer,
- 		__field(        int,            chip_select     )
- 		__field(        struct spi_transfer *,   xfer   )
- 		__field(        int,            len             )
-+		__dynamic_array(u8, rx_buf,
-+				spi_valid_rxbuf(msg, xfer) ? xfer->len : 0)
-+		__dynamic_array(u8, tx_buf,
-+				spi_valid_txbuf(msg, xfer) ? xfer->len : 0)
- 	),
- 
- 	TP_fast_assign(
-@@ -127,12 +141,21 @@ DECLARE_EVENT_CLASS(spi_transfer,
- 		__entry->chip_select = msg->spi->chip_select;
- 		__entry->xfer = xfer;
- 		__entry->len = xfer->len;
-+
-+		if (spi_valid_txbuf(msg, xfer))
-+			memcpy(__get_dynamic_array(tx_buf),
-+			       xfer->tx_buf, xfer->len);
-+
-+		if (spi_valid_rxbuf(msg, xfer))
-+			memcpy(__get_dynamic_array(rx_buf),
-+			       xfer->rx_buf, xfer->len);
- 	),
- 
--        TP_printk("spi%d.%d %p len=%d", (int)__entry->bus_num,
--		  (int)__entry->chip_select,
--		  (struct spi_message *)__entry->xfer,
--		  (int)__entry->len)
-+	TP_printk("spi%d.%d %p len=%d tx=[%*phD] rx=[%*phD]",
-+		  __entry->bus_num, __entry->chip_select,
-+		  __entry->xfer, __entry->len,
-+		  __get_dynamic_array_len(tx_buf), __get_dynamic_array(tx_buf),
-+		  __get_dynamic_array_len(rx_buf), __get_dynamic_array(rx_buf))
- );
- 
- DEFINE_EVENT(spi_transfer, spi_transfer_start,
-diff --git a/include/uapi/linux/spi/spidev.h b/include/uapi/linux/spi/spidev.h
-index c4253f0090d8..ee0f2460bff6 100644
---- a/include/uapi/linux/spi/spidev.h
-+++ b/include/uapi/linux/spi/spidev.h
-@@ -66,6 +66,9 @@
-  * @delay_usecs: If nonzero, how long to delay after the last bit transfer
-  *	before optionally deselecting the device before the next transfer.
-  * @cs_change: True to deselect device before starting the next transfer.
-+ * @word_delay_usecs: If nonzero, how long to wait between words within one
-+ *	transfer. This property needs explicit support in the SPI controller,
-+ *	otherwise it is silently ignored.
-  *
-  * This structure is mapped directly to the kernel spi_transfer structure;
-  * the fields have the same meanings, except of course that the pointers
-@@ -100,7 +103,8 @@ struct spi_ioc_transfer {
- 	__u8		cs_change;
- 	__u8		tx_nbits;
- 	__u8		rx_nbits;
--	__u16		pad;
-+	__u8		word_delay_usecs;
-+	__u8		pad;
- 
- 	/* If the contents of 'struct spi_ioc_transfer' ever change
- 	 * incompatibly, then the ioctl number (currently 0) must change;
+ 	for (i = 0; i < devtype->nr; i++) {
diff --git a/board/czechlight/common/patches/systemd/random-seed.patch b/board/czechlight/common/patches/systemd/random-seed.patch
index 5eed6f5..e79c9af 100644
--- a/board/czechlight/common/patches/systemd/random-seed.patch
+++ b/board/czechlight/common/patches/systemd/random-seed.patch
@@ -1,26 +1,37 @@
+From afb5af76c137c71bfdb94d47bd5e33dba54147f7 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jan=20Kundr=C3=A1t?= <jan.kundrat@cesnet.cz>
+Date: Wed, 4 Dec 2019 09:18:36 +0100
+Subject: [PATCH] Entropy seed for CzechLight
+
+Everything changed in sytemd v243 which gained a native service which is
+nowadays capable of crediting the seed with sufficient entropy. However,
+everything is still wrapped behind a random env variable (to guard
+against people cloning images) and runs rather late in the boot. The
+docs still suggest to run something custom "from the boot loader" on
+embedded systems with no HW random generator (hi ClearFog).
+
+So, given that we're using the pre-init shell script for seeding the
+random generator from disk, we only need this one for systemd to *save*
+the seed for the next boot.
+
+See-also: https://gerrit.cesnet.cz/c/CzechLight/br2-external/+/1548
+---
+ meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
 diff --git a/meson.build b/meson.build
-index b338886c38..a968af87ee 100644
+index e5ceb1e169..ff3af58b8f 100644
 --- a/meson.build
 +++ b/meson.build
-@@ -146,7 +146,7 @@ bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
+@@ -155,7 +155,7 @@ bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
  testsdir = join_paths(prefixdir, 'lib/systemd/tests')
  systemdstatedir = join_paths(localstatedir, 'lib/systemd')
  catalogstatedir = join_paths(systemdstatedir, 'catalog')
 -randomseeddir = join_paths(localstatedir, 'lib/systemd')
 +randomseeddir = '/cfg/random-seed'
  profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
+ ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
  
- docdir = get_option('docdir')
-diff --git a/src/random-seed/random-seed.c b/src/random-seed/random-seed.c
-index 0c5f329756..f30f32fb61 100644
---- a/src/random-seed/random-seed.c
-+++ b/src/random-seed/random-seed.c
-@@ -17,7 +17,7 @@
- #include "string-util.h"
- #include "util.h"
- 
--#define POOL_SIZE_MIN 512
-+#define POOL_SIZE_MIN 4096
- #define POOL_SIZE_MAX (10*1024*1024)
- 
- static int run(int argc, char *argv[]) {
+-- 
+2.21.0
+
diff --git a/configs/czechlight_clearfog_defconfig b/configs/czechlight_clearfog_defconfig
index cd9ce8c..8126a8b 100644
--- a/configs/czechlight_clearfog_defconfig
+++ b/configs/czechlight_clearfog_defconfig
@@ -25,7 +25,7 @@
 BR2_ROOTFS_POST_SCRIPT_ARGS="-c $(BR2_EXTERNAL_CZECHLIGHT_PATH)/board/czechlight/clearfog/genimage.cfg"
 BR2_LINUX_KERNEL=y
 BR2_LINUX_KERNEL_CUSTOM_VERSION=y
-BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="5.0"
+BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="5.4.1"
 BR2_LINUX_KERNEL_PATCH="$(BR2_EXTERNAL_CZECHLIGHT_PATH)/board/czechlight/clearfog/patches/linux.patch"
 BR2_LINUX_KERNEL_DEFCONFIG="mvebu_v7"
 BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL_CZECHLIGHT_PATH)/board/czechlight/clearfog/linux.fragment $(BR2_EXTERNAL_CZECHLIGHT_PATH)/board/czechlight/common/linux.fragment"
@@ -44,11 +44,15 @@
 BR2_PACKAGE_PMBUS_PEEK=y
 BR2_PACKAGE_SPI_TOOLS=y
 BR2_PACKAGE_UBOOT_TOOLS=y
+BR2_PACKAGE_LIBSSH=y
+BR2_PACKAGE_LIBSSH_SERVER=y
 BR2_PACKAGE_LIBGPIOD_TOOLS=y
 BR2_PACKAGE_MSTPD=y
+BR2_PACKAGE_NGHTTP2_CXX=y
 BR2_PACKAGE_ETHTOOL=y
 BR2_PACKAGE_IPROUTE2=y
 BR2_PACKAGE_NETCONF_CLI=y
+BR2_PACKAGE_NETOPEER2_CLI=y
 BR2_PACKAGE_TCPDUMP=y
 BR2_PACKAGE_BASH=y
 BR2_PACKAGE_INOTIFY_TOOLS=y
diff --git a/package/cla-sysrepo/Config.in b/package/cla-sysrepo/Config.in
index 1b8d59b..873a9aa 100644
--- a/package/cla-sysrepo/Config.in
+++ b/package/cla-sysrepo/Config.in
@@ -1,6 +1,8 @@
 config BR2_PACKAGE_CLA_SYSREPO
 	bool "cla-sysrepo"
 	select BR2_PACKAGE_SYSREPO
+	select BR2_PACKAGE_SYSREPO_CPP
+	select BR2_PACKAGE_LIBYANG_CPP
 	select BR2_PACKAGE_DOCOPT_CPP
 	select BR2_PACKAGE_SPDLOG
 	select BR2_PACKAGE_SYSTEMD
diff --git a/submodules/buildroot b/submodules/buildroot
index 34e8ff9..22f8658 160000
--- a/submodules/buildroot
+++ b/submodules/buildroot
@@ -1 +1 @@
-Subproject commit 34e8ff94a3d25d00dcc5439ac5da8badbd6aa190
+Subproject commit 22f86582534d83529f61c378183afe285bc8a6b2
diff --git a/submodules/cla-sysrepo b/submodules/cla-sysrepo
index b70e8f8..29dc602 160000
--- a/submodules/cla-sysrepo
+++ b/submodules/cla-sysrepo
@@ -1 +1 @@
-Subproject commit b70e8f8ddef196215c838ebe23fc3d7e24d96166
+Subproject commit 29dc6021bf3f393456d52402df01749db983c4aa
diff --git a/submodules/netconf-cli b/submodules/netconf-cli
index 1ce4b32..5395e71 160000
--- a/submodules/netconf-cli
+++ b/submodules/netconf-cli
@@ -1 +1 @@
-Subproject commit 1ce4b32b8f89cc512182d433d432981415af9930
+Subproject commit 5395e715f637d43b429623dc07744cffd0351739
