diff --git a/board/czechlight/clearfog/patches/linux.patch b/board/czechlight/clearfog/patches/linux.patch
index fe205b1..c7e0fae 100644
--- a/board/czechlight/clearfog/patches/linux.patch
+++ b/board/czechlight/clearfog/patches/linux.patch
@@ -1,5 +1,76 @@
+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..7872d61d23e4 100644
+index 625a22e2f211..a0b1eb9aedad 100644
 --- a/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt
 +++ b/Documentation/devicetree/bindings/pinctrl/pinctrl-mcp23s08.txt
 @@ -144,3 +144,38 @@ gpio21: gpio@21 {
@@ -15,13 +86,13 @@
 +that the configured addresses match those in the microchip,spi-present-mask:
 +
 +gpio@0 {
-+        compatible = "microchip,mcp23s17";
-+        gpio-controller;
-+        #gpio-cells = <2>;
++	compatible = "microchip,mcp23s17";
++	gpio-controller;
++	#gpio-cells = <2>;
 +	/* this bitmask has bits #0 (0x01) and #2 (0x04) set */
-+        spi-present-mask = <0x05>;
-+        reg = <0>;
-+        spi-max-frequency = <1000000>;
++	spi-present-mask = <0x05>;
++	reg = <0>;
++	spi-max-frequency = <1000000>;
 +
 +	gpio-bank@1 {
 +		address = <0>;
@@ -41,41 +112,662 @@
 +		gpio-line-names = ...
 +	};
 +};
-diff --git a/Documentation/devicetree/bindings/spi/spi-orion.txt b/Documentation/devicetree/bindings/spi/spi-orion.txt
-index 8434a65fc12a..ed35cba1bc33 100644
---- a/Documentation/devicetree/bindings/spi/spi-orion.txt
-+++ b/Documentation/devicetree/bindings/spi/spi-orion.txt
-@@ -29,6 +29,10 @@ Optional properties:
- 		used, the name must be "core", and "axi" (the latter
- 		is only for Armada 7K/8K).
+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)
  
-+Optional properties of child nodes (SPI slave devices):
-+- linux,spi-wdelay : If present and non-zero, specifies a delay in
-+		     microseconds between words transferred over the SPI bus.
+ 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:
-        spi@10600 {
-@@ -77,3 +81,19 @@ are used in the default indirect (PIO) mode):
- For further information on the MBus bindings, please see the MBus
- DT documentation:
- Documentation/devicetree/bindings/bus/mvebu-mbus.txt
+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
 +
-+Example of a per-child inter-word delay:
+ 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);
+ }
 +
-+	spi0: spi@10600 {
-+		/* ... */
-+
-+		some_slave_device@2 {
-+			reg = <2>;
-+			compatible = "something";
-+			/* ... */
-+
-+			/* Wait 3 microseconds between all words within all
-+			SPI transactions */
-+			linux,spi-wdelay = /bits/ 16 <3>;
-+		};
-+	};
++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
@@ -164,19 +856,1273 @@
  	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..64c67478f781 100644
+index 98905d4a79ca..dac31601fc53 100644
 --- a/drivers/pinctrl/pinctrl-mcp23s08.c
 +++ b/drivers/pinctrl/pinctrl-mcp23s08.c
-@@ -16,6 +16,7 @@
- #include <linux/pinctrl/pinctrl.h>
- #include <linux/pinctrl/pinconf.h>
- #include <linux/pinctrl/pinconf-generic.h>
-+#include "../gpio/gpiolib.h"
- 
- /*
-  * MCP types supported by driver
-@@ -68,6 +69,7 @@ struct mcp23s08 {
+@@ -68,6 +68,7 @@ struct mcp23s08 {
  	struct mutex		lock;
  
  	struct gpio_chip	chip;
@@ -184,7 +2130,7 @@
  
  	struct regmap		*regmap;
  	struct device		*dev;
-@@ -265,7 +267,6 @@ static int mcp_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
+@@ -265,7 +266,6 @@ static int mcp_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin,
  		status = (data & BIT(pin)) ? 1 : 0;
  		break;
  	default:
@@ -192,7 +2138,7 @@
  		return -ENOTSUPP;
  	}
  
-@@ -292,7 +293,7 @@ static int mcp_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
+@@ -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:
@@ -201,7 +2147,7 @@
  			return -ENOTSUPP;
  		}
  	}
-@@ -607,15 +608,6 @@ static void mcp23s08_irq_bus_unlock(struct irq_data *data)
+@@ -607,15 +607,6 @@ static void mcp23s08_irq_bus_unlock(struct irq_data *data)
  	mutex_unlock(&mcp->lock);
  }
  
@@ -217,7 +2163,7 @@
  static int mcp23s08_irq_setup(struct mcp23s08 *mcp)
  {
  	struct gpio_chip *chip = &mcp->chip;
-@@ -645,7 +637,7 @@ static int mcp23s08_irqchip_setup(struct mcp23s08 *mcp)
+@@ -645,7 +636,7 @@ static int mcp23s08_irqchip_setup(struct mcp23s08 *mcp)
  	int err;
  
  	err =  gpiochip_irqchip_add_nested(chip,
@@ -226,7 +2172,7 @@
  					   0,
  					   handle_simple_irq,
  					   IRQ_TYPE_NONE);
-@@ -656,7 +648,7 @@ static int mcp23s08_irqchip_setup(struct mcp23s08 *mcp)
+@@ -656,7 +647,7 @@ static int mcp23s08_irqchip_setup(struct mcp23s08 *mcp)
  	}
  
  	gpiochip_set_nested_irqchip(chip,
@@ -235,7 +2181,7 @@
  				    mcp->irq);
  
  	return 0;
-@@ -664,115 +656,6 @@ static int mcp23s08_irqchip_setup(struct mcp23s08 *mcp)
+@@ -664,115 +655,6 @@ static int mcp23s08_irqchip_setup(struct mcp23s08 *mcp)
  
  /*----------------------------------------------------------------------*/
  
@@ -351,7 +2297,7 @@
  static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
  			      void *data, unsigned addr, unsigned type,
  			      unsigned int base, int cs)
-@@ -793,7 +676,6 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
+@@ -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;
@@ -359,7 +2305,7 @@
  #ifdef CONFIG_OF_GPIO
  	mcp->chip.of_gpio_n_cells = 2;
  	mcp->chip.of_node = dev->of_node;
-@@ -1047,6 +929,13 @@ static int mcp230xx_probe(struct i2c_client *client,
+@@ -1047,6 +928,13 @@ static int mcp230xx_probe(struct i2c_client *client,
  		return -ENOMEM;
  
  	mcp->irq = client->irq;
@@ -373,7 +2319,7 @@
  	status = mcp23s08_probe_one(mcp, &client->dev, client, client->addr,
  				    id->driver_data, pdata->base, 0);
  	if (status)
-@@ -1104,6 +993,7 @@ static int mcp23s08_probe(struct spi_device *spi)
+@@ -1104,6 +992,7 @@ static int mcp23s08_probe(struct spi_device *spi)
  	int				status, type;
  	unsigned			ngpio = 0;
  	const struct			of_device_id *match;
@@ -381,7 +2327,7 @@
  
  	match = of_match_device(of_match_ptr(mcp23s08_spi_of_match), &spi->dev);
  	if (match)
-@@ -1144,8 +1034,7 @@ static int mcp23s08_probe(struct spi_device *spi)
+@@ -1144,8 +1033,7 @@ static int mcp23s08_probe(struct spi_device *spi)
  		return -ENODEV;
  
  	data = devm_kzalloc(&spi->dev,
@@ -391,7 +2337,7 @@
  	if (!data)
  		return -ENOMEM;
  
-@@ -1157,6 +1046,13 @@ static int mcp23s08_probe(struct spi_device *spi)
+@@ -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;
@@ -405,7 +2351,7 @@
  		status = mcp23s08_probe_one(data->mcp[addr], &spi->dev, spi,
  					    0x40 | (addr << 1), type,
  					    pdata->base, addr);
-@@ -1166,6 +1062,16 @@ static int mcp23s08_probe(struct spi_device *spi)
+@@ -1166,6 +1061,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;
@@ -422,19 +2368,4166 @@
  	}
  	data->ngpio = ngpio;
  
-diff --git a/drivers/spi/spi-orion.c b/drivers/spi/spi-orion.c
-index 7f280567093e..1c4ec4452700 100644
---- a/drivers/spi/spi-orion.c
-+++ b/drivers/spi/spi-orion.c
-@@ -93,6 +93,7 @@ struct orion_direct_acc {
+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
  
- struct orion_child_options {
- 	struct orion_direct_acc direct_access;
-+	u16			word_delay;
+ 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
+--- a/drivers/spi/spi-orion.c
++++ b/drivers/spi/spi-orion.c
+@@ -91,10 +91,6 @@ struct orion_direct_acc {
+ 	u32			size;
+ };
+ 
+-struct orion_child_options {
+-	struct orion_direct_acc direct_access;
+-};
+-
  struct orion_spi {
-@@ -433,7 +434,7 @@ orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
+ 	struct spi_master	*master;
+ 	void __iomem		*base;
+@@ -103,7 +99,7 @@ struct orion_spi {
+ 	const struct orion_spi_dev *devdata;
+ 	int			unused_hw_gpio;
+ 
+-	struct orion_child_options	child[ORION_NUM_CHIPSELECTS];
++	struct orion_direct_acc	direct_access[ORION_NUM_CHIPSELECTS];
+ };
+ 
+ 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)
  	int cs = spi->chip_select;
  	void __iomem *vaddr;
  
@@ -443,47 +6536,5408 @@
  	count = xfer->len;
  
  	orion_spi = spi_master_get_devdata(spi->master);
-@@ -470,6 +471,8 @@ orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
+@@ -442,7 +438,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.
+ 	 */
+-	vaddr = orion_spi->child[cs].direct_access.vaddr;
++	vaddr = orion_spi->direct_access[cs].vaddr;
+ 
+ 	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 (orion_spi->child[cs].word_delay)
-+				udelay(orion_spi->child[cs].word_delay);
++			if (xfer->word_delay_usecs)
++				udelay(xfer->word_delay_usecs);
  		} while (count);
  	} else if (word_len == 16) {
  		const u16 *tx = xfer->tx_buf;
-@@ -478,6 +481,8 @@ orion_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
- 		do {
+@@ -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;
-+			if (orion_spi->child[cs].word_delay)
-+				udelay(orion_spi->child[cs].word_delay);
  			count -= 2;
++			if (xfer->word_delay_usecs)
++				udelay(xfer->word_delay_usecs);
  		} while (count);
  	}
-@@ -734,6 +739,12 @@ static int orion_spi_probe(struct platform_device *pdev)
+ 
+@@ -683,7 +683,6 @@ static int orion_spi_probe(struct platform_device *pdev)
+ 	}
+ 
+ 	for_each_available_child_of_node(pdev->dev.of_node, np) {
+-		struct orion_direct_acc *dir_acc;
+ 		u32 cs;
+ 		int cs_gpio;
+ 
+@@ -751,13 +750,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.
+ 		 */
+-		dir_acc = &spi->child[cs].direct_access;
+-		dir_acc->vaddr = devm_ioremap(&pdev->dev, r->start, PAGE_SIZE);
+-		if (!dir_acc->vaddr) {
++		spi->direct_access[cs].vaddr = devm_ioremap(&pdev->dev,
++							    r->start,
++							    PAGE_SIZE);
++		if (!spi->direct_access[cs].vaddr) {
+ 			status = -ENOMEM;
+ 			goto out_rel_axi_clk;
+ 		}
+-		dir_acc->size = PAGE_SIZE;
++		spi->direct_access[cs].size = PAGE_SIZE;
+ 
+ 		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->child[cs].word_delay = 0;
-+		if (!of_property_read_u16(np, "linux,spi-wdelay",
-+					&spi->child[cs].word_delay))
-+			dev_info(&pdev->dev, "%pOF: %dus delay between words\n",
-+					np, spi->child[cs].word_delay);
-+
- 		/*
- 		 * Check if an address is configured for this SPI device. If
- 		 * not, the MBus mapping via the 'ranges' property in the 'soc'
-@@ -745,6 +756,12 @@ static int orion_spi_probe(struct platform_device *pdev)
- 		if (status)
- 			continue;
+-		spi_finalize_current_transfer(drv_data->master);
++		spi_finalize_current_transfer(drv_data->controller);
+ 	}
+ }
  
-+		if (spi->child[cs].word_delay) {
-+			dev_warn(&pdev->dev,
-+				"%pOF linux,spi-wdelay takes preference over a direct-mode", np);
-+			continue;
+@@ -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);
  		/*
- 		 * Only map one page for direct access. This is enough for the
- 		 * simple TX transfer which only writes to the first word.
+ 		 * 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
+--- 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);
+ 
+ 	/* 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);
+ 
+-		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);
+ 	}
+ 
+ 	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);
+ 
++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;
