Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'memory-controller-drv-renesas-6.16' of https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-mem-ctrl into soc/drivers

Renesas memory controller drivers for v6.16

Improvements and new device support for the Renesas RPC IF memory
controller driver:
1. Minor cleanup and improvements.
2. Refactor the driver to accommodate for newly added Renesas RZ/G3E support:
- Acquire two resets instead of only one,
- Add RZ/G3E xSPI support with different register layout and its own,
new interface for Renesas SPI.

* tag 'memory-controller-drv-renesas-6.16' of https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-mem-ctrl:
memory: renesas-rpc-if: Add missing static keyword
memory: renesas-rpc-if: Add RZ/G3E xSPI support
memory: renesas-rpc-if: Add wrapper functions
memory: renesas-rpc-if: Add regmap to struct rpcif_info
memory: renesas-rpc-if: Use devm_reset_control_array_get_exclusive()
memory: renesas-rpc-if: Move rpc-if reg definitions
dt-bindings: memory: Document RZ/G3E support
memory: renesas-rpc-if: Move rpcif_info definitions near to the user
memory: renesas-rpc-if: Fix RPCIF_DRENR_CDB macro error

Link: https://lore.kernel.org/r/20250508090749.51379-2-krzysztof.kozlowski@linaro.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+914 -191
+135
Documentation/devicetree/bindings/memory-controllers/renesas,rzg3e-xspi.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/memory-controllers/renesas,rzg3e-xspi.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Renesas Expanded Serial Peripheral Interface (xSPI) 8 + 9 + maintainers: 10 + - Biju Das <biju.das.jz@bp.renesas.com> 11 + 12 + description: | 13 + Renesas xSPI allows a SPI flash connected to the SoC to be accessed via 14 + the memory-mapping or the manual command mode. 15 + 16 + The flash chip itself should be represented by a subnode of the XSPI node. 17 + The flash interface is selected based on the "compatible" property of this 18 + subnode: 19 + - "jedec,spi-nor"; 20 + 21 + allOf: 22 + - $ref: /schemas/spi/spi-controller.yaml# 23 + 24 + properties: 25 + compatible: 26 + const: renesas,r9a09g047-xspi # RZ/G3E 27 + 28 + reg: 29 + items: 30 + - description: xSPI registers 31 + - description: direct mapping area 32 + 33 + reg-names: 34 + items: 35 + - const: regs 36 + - const: dirmap 37 + 38 + interrupts: 39 + items: 40 + - description: Interrupt pulse signal by factors excluding errors 41 + - description: Interrupt pulse signal by error factors 42 + 43 + interrupt-names: 44 + items: 45 + - const: pulse 46 + - const: err_pulse 47 + 48 + clocks: 49 + items: 50 + - description: AHB clock 51 + - description: AXI clock 52 + - description: SPI clock 53 + - description: Double speed SPI clock 54 + 55 + clock-names: 56 + items: 57 + - const: ahb 58 + - const: axi 59 + - const: spi 60 + - const: spix2 61 + 62 + power-domains: 63 + maxItems: 1 64 + 65 + resets: 66 + items: 67 + - description: Hardware reset 68 + - description: AXI reset 69 + 70 + reset-names: 71 + items: 72 + - const: hresetn 73 + - const: aresetn 74 + 75 + renesas,xspi-cs-addr-sys: 76 + $ref: /schemas/types.yaml#/definitions/phandle 77 + description: | 78 + Phandle to the system controller (sys) that allows to configure 79 + xSPI CS0 and CS1 addresses. 80 + 81 + patternProperties: 82 + "flash@[0-9a-f]+$": 83 + type: object 84 + additionalProperties: true 85 + 86 + properties: 87 + compatible: 88 + contains: 89 + const: jedec,spi-nor 90 + 91 + required: 92 + - compatible 93 + - reg 94 + - reg-names 95 + - interrupts 96 + - interrupt-names 97 + - clocks 98 + - clock-names 99 + - power-domains 100 + - resets 101 + - reset-names 102 + - '#address-cells' 103 + - '#size-cells' 104 + 105 + unevaluatedProperties: false 106 + 107 + examples: 108 + - | 109 + #include <dt-bindings/interrupt-controller/arm-gic.h> 110 + #include <dt-bindings/clock/renesas,r9a09g047-cpg.h> 111 + 112 + spi@11030000 { 113 + compatible = "renesas,r9a09g047-xspi"; 114 + reg = <0x11030000 0x10000>, <0x20000000 0x10000000>; 115 + reg-names = "regs", "dirmap"; 116 + interrupts = <GIC_SPI 228 IRQ_TYPE_EDGE_RISING>, 117 + <GIC_SPI 229 IRQ_TYPE_EDGE_RISING>; 118 + interrupt-names = "pulse", "err_pulse"; 119 + clocks = <&cpg CPG_MOD 0x9f>, <&cpg CPG_MOD 0xa0>, 120 + <&cpg CPG_CORE 9>, <&cpg CPG_MOD 0xa1>; 121 + clock-names = "ahb", "axi", "spi", "spix2"; 122 + power-domains = <&cpg>; 123 + resets = <&cpg 0xa3>, <&cpg 0xa4>; 124 + reset-names = "hresetn", "aresetn"; 125 + #address-cells = <1>; 126 + #size-cells = <0>; 127 + 128 + flash@0 { 129 + compatible = "jedec,spi-nor"; 130 + reg = <0>; 131 + spi-max-frequency = <40000000>; 132 + spi-tx-bus-width = <1>; 133 + spi-rx-bus-width = <1>; 134 + }; 135 + };
+147
drivers/memory/renesas-rpc-if-regs.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * R-Car RPC Interface Registers Definitions 4 + * 5 + * Copyright (C) 2025 Renesas Electronics Corporation 6 + */ 7 + 8 + #ifndef __RENESAS_RPC_IF_REGS_H__ 9 + #define __RENESAS_RPC_IF_REGS_H__ 10 + 11 + #include <linux/bits.h> 12 + 13 + #define RPCIF_CMNCR 0x0000 /* R/W */ 14 + #define RPCIF_CMNCR_MD BIT(31) 15 + #define RPCIF_CMNCR_MOIIO3(val) (((val) & 0x3) << 22) 16 + #define RPCIF_CMNCR_MOIIO2(val) (((val) & 0x3) << 20) 17 + #define RPCIF_CMNCR_MOIIO1(val) (((val) & 0x3) << 18) 18 + #define RPCIF_CMNCR_MOIIO0(val) (((val) & 0x3) << 16) 19 + #define RPCIF_CMNCR_MOIIO(val) (RPCIF_CMNCR_MOIIO0(val) | RPCIF_CMNCR_MOIIO1(val) | \ 20 + RPCIF_CMNCR_MOIIO2(val) | RPCIF_CMNCR_MOIIO3(val)) 21 + #define RPCIF_CMNCR_IO3FV(val) (((val) & 0x3) << 14) /* documented for RZ/G2L */ 22 + #define RPCIF_CMNCR_IO2FV(val) (((val) & 0x3) << 12) /* documented for RZ/G2L */ 23 + #define RPCIF_CMNCR_IO0FV(val) (((val) & 0x3) << 8) 24 + #define RPCIF_CMNCR_IOFV(val) (RPCIF_CMNCR_IO0FV(val) | RPCIF_CMNCR_IO2FV(val) | \ 25 + RPCIF_CMNCR_IO3FV(val)) 26 + #define RPCIF_CMNCR_BSZ(val) (((val) & 0x3) << 0) 27 + 28 + #define RPCIF_SSLDR 0x0004 /* R/W */ 29 + #define RPCIF_SSLDR_SPNDL(d) (((d) & 0x7) << 16) 30 + #define RPCIF_SSLDR_SLNDL(d) (((d) & 0x7) << 8) 31 + #define RPCIF_SSLDR_SCKDL(d) (((d) & 0x7) << 0) 32 + 33 + #define RPCIF_DRCR 0x000C /* R/W */ 34 + #define RPCIF_DRCR_SSLN BIT(24) 35 + #define RPCIF_DRCR_RBURST(v) ((((v) - 1) & 0x1F) << 16) 36 + #define RPCIF_DRCR_RCF BIT(9) 37 + #define RPCIF_DRCR_RBE BIT(8) 38 + #define RPCIF_DRCR_SSLE BIT(0) 39 + 40 + #define RPCIF_DRCMR 0x0010 /* R/W */ 41 + #define RPCIF_DRCMR_CMD(c) (((c) & 0xFF) << 16) 42 + #define RPCIF_DRCMR_OCMD(c) (((c) & 0xFF) << 0) 43 + 44 + #define RPCIF_DREAR 0x0014 /* R/W */ 45 + #define RPCIF_DREAR_EAV(c) (((c) & 0xF) << 16) 46 + #define RPCIF_DREAR_EAC(c) (((c) & 0x7) << 0) 47 + 48 + #define RPCIF_DROPR 0x0018 /* R/W */ 49 + 50 + #define RPCIF_DRENR 0x001C /* R/W */ 51 + #define RPCIF_DRENR_CDB(o) (((u32)((o) & 0x3)) << 30) 52 + #define RPCIF_DRENR_OCDB(o) (((o) & 0x3) << 28) 53 + #define RPCIF_DRENR_ADB(o) (((o) & 0x3) << 24) 54 + #define RPCIF_DRENR_OPDB(o) (((o) & 0x3) << 20) 55 + #define RPCIF_DRENR_DRDB(o) (((o) & 0x3) << 16) 56 + #define RPCIF_DRENR_DME BIT(15) 57 + #define RPCIF_DRENR_CDE BIT(14) 58 + #define RPCIF_DRENR_OCDE BIT(12) 59 + #define RPCIF_DRENR_ADE(v) (((v) & 0xF) << 8) 60 + #define RPCIF_DRENR_OPDE(v) (((v) & 0xF) << 4) 61 + 62 + #define RPCIF_SMCR 0x0020 /* R/W */ 63 + #define RPCIF_SMCR_SSLKP BIT(8) 64 + #define RPCIF_SMCR_SPIRE BIT(2) 65 + #define RPCIF_SMCR_SPIWE BIT(1) 66 + #define RPCIF_SMCR_SPIE BIT(0) 67 + 68 + #define RPCIF_SMCMR 0x0024 /* R/W */ 69 + #define RPCIF_SMCMR_CMD(c) (((c) & 0xFF) << 16) 70 + #define RPCIF_SMCMR_OCMD(c) (((c) & 0xFF) << 0) 71 + 72 + #define RPCIF_SMADR 0x0028 /* R/W */ 73 + 74 + #define RPCIF_SMOPR 0x002C /* R/W */ 75 + #define RPCIF_SMOPR_OPD3(o) (((o) & 0xFF) << 24) 76 + #define RPCIF_SMOPR_OPD2(o) (((o) & 0xFF) << 16) 77 + #define RPCIF_SMOPR_OPD1(o) (((o) & 0xFF) << 8) 78 + #define RPCIF_SMOPR_OPD0(o) (((o) & 0xFF) << 0) 79 + 80 + #define RPCIF_SMENR 0x0030 /* R/W */ 81 + #define RPCIF_SMENR_CDB(o) (((o) & 0x3) << 30) 82 + #define RPCIF_SMENR_OCDB(o) (((o) & 0x3) << 28) 83 + #define RPCIF_SMENR_ADB(o) (((o) & 0x3) << 24) 84 + #define RPCIF_SMENR_OPDB(o) (((o) & 0x3) << 20) 85 + #define RPCIF_SMENR_SPIDB(o) (((o) & 0x3) << 16) 86 + #define RPCIF_SMENR_DME BIT(15) 87 + #define RPCIF_SMENR_CDE BIT(14) 88 + #define RPCIF_SMENR_OCDE BIT(12) 89 + #define RPCIF_SMENR_ADE(v) (((v) & 0xF) << 8) 90 + #define RPCIF_SMENR_OPDE(v) (((v) & 0xF) << 4) 91 + #define RPCIF_SMENR_SPIDE(v) (((v) & 0xF) << 0) 92 + 93 + #define RPCIF_SMRDR0 0x0038 /* R */ 94 + #define RPCIF_SMRDR1 0x003C /* R */ 95 + #define RPCIF_SMWDR0 0x0040 /* W */ 96 + #define RPCIF_SMWDR1 0x0044 /* W */ 97 + 98 + #define RPCIF_CMNSR 0x0048 /* R */ 99 + #define RPCIF_CMNSR_SSLF BIT(1) 100 + #define RPCIF_CMNSR_TEND BIT(0) 101 + 102 + #define RPCIF_DRDMCR 0x0058 /* R/W */ 103 + #define RPCIF_DMDMCR_DMCYC(v) ((((v) - 1) & 0x1F) << 0) 104 + 105 + #define RPCIF_DRDRENR 0x005C /* R/W */ 106 + #define RPCIF_DRDRENR_HYPE(v) (((v) & 0x7) << 12) 107 + #define RPCIF_DRDRENR_ADDRE BIT(8) 108 + #define RPCIF_DRDRENR_OPDRE BIT(4) 109 + #define RPCIF_DRDRENR_DRDRE BIT(0) 110 + 111 + #define RPCIF_SMDMCR 0x0060 /* R/W */ 112 + #define RPCIF_SMDMCR_DMCYC(v) ((((v) - 1) & 0x1F) << 0) 113 + 114 + #define RPCIF_SMDRENR 0x0064 /* R/W */ 115 + #define RPCIF_SMDRENR_HYPE(v) (((v) & 0x7) << 12) 116 + #define RPCIF_SMDRENR_ADDRE BIT(8) 117 + #define RPCIF_SMDRENR_OPDRE BIT(4) 118 + #define RPCIF_SMDRENR_SPIDRE BIT(0) 119 + 120 + #define RPCIF_PHYADD 0x0070 /* R/W available on R-Car E3/D3/V3M and RZ/G2{E,L} */ 121 + #define RPCIF_PHYWR 0x0074 /* R/W available on R-Car E3/D3/V3M and RZ/G2{E,L} */ 122 + 123 + #define RPCIF_PHYCNT 0x007C /* R/W */ 124 + #define RPCIF_PHYCNT_CAL BIT(31) 125 + #define RPCIF_PHYCNT_OCTA(v) (((v) & 0x3) << 22) 126 + #define RPCIF_PHYCNT_EXDS BIT(21) 127 + #define RPCIF_PHYCNT_OCT BIT(20) 128 + #define RPCIF_PHYCNT_DDRCAL BIT(19) 129 + #define RPCIF_PHYCNT_HS BIT(18) 130 + #define RPCIF_PHYCNT_CKSEL(v) (((v) & 0x3) << 16) /* valid only for RZ/G2L */ 131 + #define RPCIF_PHYCNT_STRTIM(v) (((v) & 0x7) << 15 | ((v) & 0x8) << 24) /* valid for R-Car and RZ/G2{E,H,M,N} */ 132 + 133 + #define RPCIF_PHYCNT_WBUF2 BIT(4) 134 + #define RPCIF_PHYCNT_WBUF BIT(2) 135 + #define RPCIF_PHYCNT_PHYMEM(v) (((v) & 0x3) << 0) 136 + #define RPCIF_PHYCNT_PHYMEM_MASK GENMASK(1, 0) 137 + 138 + #define RPCIF_PHYOFFSET1 0x0080 /* R/W */ 139 + #define RPCIF_PHYOFFSET1_DDRTMG(v) (((v) & 0x3) << 28) 140 + 141 + #define RPCIF_PHYOFFSET2 0x0084 /* R/W */ 142 + #define RPCIF_PHYOFFSET2_OCTTMG(v) (((v) & 0x7) << 8) 143 + 144 + #define RPCIF_PHYINT 0x0088 /* R/W */ 145 + #define RPCIF_PHYINT_WPVAL BIT(1) 146 + 147 + #endif /* __RENESAS_RPC_IF_REGS_H__ */
+523 -191
drivers/memory/renesas-rpc-if.c
··· 18 18 19 19 #include <memory/renesas-rpc-if.h> 20 20 21 - #define RPCIF_CMNCR 0x0000 /* R/W */ 22 - #define RPCIF_CMNCR_MD BIT(31) 23 - #define RPCIF_CMNCR_MOIIO3(val) (((val) & 0x3) << 22) 24 - #define RPCIF_CMNCR_MOIIO2(val) (((val) & 0x3) << 20) 25 - #define RPCIF_CMNCR_MOIIO1(val) (((val) & 0x3) << 18) 26 - #define RPCIF_CMNCR_MOIIO0(val) (((val) & 0x3) << 16) 27 - #define RPCIF_CMNCR_MOIIO(val) (RPCIF_CMNCR_MOIIO0(val) | RPCIF_CMNCR_MOIIO1(val) | \ 28 - RPCIF_CMNCR_MOIIO2(val) | RPCIF_CMNCR_MOIIO3(val)) 29 - #define RPCIF_CMNCR_IO3FV(val) (((val) & 0x3) << 14) /* documented for RZ/G2L */ 30 - #define RPCIF_CMNCR_IO2FV(val) (((val) & 0x3) << 12) /* documented for RZ/G2L */ 31 - #define RPCIF_CMNCR_IO0FV(val) (((val) & 0x3) << 8) 32 - #define RPCIF_CMNCR_IOFV(val) (RPCIF_CMNCR_IO0FV(val) | RPCIF_CMNCR_IO2FV(val) | \ 33 - RPCIF_CMNCR_IO3FV(val)) 34 - #define RPCIF_CMNCR_BSZ(val) (((val) & 0x3) << 0) 35 - 36 - #define RPCIF_SSLDR 0x0004 /* R/W */ 37 - #define RPCIF_SSLDR_SPNDL(d) (((d) & 0x7) << 16) 38 - #define RPCIF_SSLDR_SLNDL(d) (((d) & 0x7) << 8) 39 - #define RPCIF_SSLDR_SCKDL(d) (((d) & 0x7) << 0) 40 - 41 - #define RPCIF_DRCR 0x000C /* R/W */ 42 - #define RPCIF_DRCR_SSLN BIT(24) 43 - #define RPCIF_DRCR_RBURST(v) ((((v) - 1) & 0x1F) << 16) 44 - #define RPCIF_DRCR_RCF BIT(9) 45 - #define RPCIF_DRCR_RBE BIT(8) 46 - #define RPCIF_DRCR_SSLE BIT(0) 47 - 48 - #define RPCIF_DRCMR 0x0010 /* R/W */ 49 - #define RPCIF_DRCMR_CMD(c) (((c) & 0xFF) << 16) 50 - #define RPCIF_DRCMR_OCMD(c) (((c) & 0xFF) << 0) 51 - 52 - #define RPCIF_DREAR 0x0014 /* R/W */ 53 - #define RPCIF_DREAR_EAV(c) (((c) & 0xF) << 16) 54 - #define RPCIF_DREAR_EAC(c) (((c) & 0x7) << 0) 55 - 56 - #define RPCIF_DROPR 0x0018 /* R/W */ 57 - 58 - #define RPCIF_DRENR 0x001C /* R/W */ 59 - #define RPCIF_DRENR_CDB(o) (u32)((((o) & 0x3) << 30)) 60 - #define RPCIF_DRENR_OCDB(o) (((o) & 0x3) << 28) 61 - #define RPCIF_DRENR_ADB(o) (((o) & 0x3) << 24) 62 - #define RPCIF_DRENR_OPDB(o) (((o) & 0x3) << 20) 63 - #define RPCIF_DRENR_DRDB(o) (((o) & 0x3) << 16) 64 - #define RPCIF_DRENR_DME BIT(15) 65 - #define RPCIF_DRENR_CDE BIT(14) 66 - #define RPCIF_DRENR_OCDE BIT(12) 67 - #define RPCIF_DRENR_ADE(v) (((v) & 0xF) << 8) 68 - #define RPCIF_DRENR_OPDE(v) (((v) & 0xF) << 4) 69 - 70 - #define RPCIF_SMCR 0x0020 /* R/W */ 71 - #define RPCIF_SMCR_SSLKP BIT(8) 72 - #define RPCIF_SMCR_SPIRE BIT(2) 73 - #define RPCIF_SMCR_SPIWE BIT(1) 74 - #define RPCIF_SMCR_SPIE BIT(0) 75 - 76 - #define RPCIF_SMCMR 0x0024 /* R/W */ 77 - #define RPCIF_SMCMR_CMD(c) (((c) & 0xFF) << 16) 78 - #define RPCIF_SMCMR_OCMD(c) (((c) & 0xFF) << 0) 79 - 80 - #define RPCIF_SMADR 0x0028 /* R/W */ 81 - 82 - #define RPCIF_SMOPR 0x002C /* R/W */ 83 - #define RPCIF_SMOPR_OPD3(o) (((o) & 0xFF) << 24) 84 - #define RPCIF_SMOPR_OPD2(o) (((o) & 0xFF) << 16) 85 - #define RPCIF_SMOPR_OPD1(o) (((o) & 0xFF) << 8) 86 - #define RPCIF_SMOPR_OPD0(o) (((o) & 0xFF) << 0) 87 - 88 - #define RPCIF_SMENR 0x0030 /* R/W */ 89 - #define RPCIF_SMENR_CDB(o) (((o) & 0x3) << 30) 90 - #define RPCIF_SMENR_OCDB(o) (((o) & 0x3) << 28) 91 - #define RPCIF_SMENR_ADB(o) (((o) & 0x3) << 24) 92 - #define RPCIF_SMENR_OPDB(o) (((o) & 0x3) << 20) 93 - #define RPCIF_SMENR_SPIDB(o) (((o) & 0x3) << 16) 94 - #define RPCIF_SMENR_DME BIT(15) 95 - #define RPCIF_SMENR_CDE BIT(14) 96 - #define RPCIF_SMENR_OCDE BIT(12) 97 - #define RPCIF_SMENR_ADE(v) (((v) & 0xF) << 8) 98 - #define RPCIF_SMENR_OPDE(v) (((v) & 0xF) << 4) 99 - #define RPCIF_SMENR_SPIDE(v) (((v) & 0xF) << 0) 100 - 101 - #define RPCIF_SMRDR0 0x0038 /* R */ 102 - #define RPCIF_SMRDR1 0x003C /* R */ 103 - #define RPCIF_SMWDR0 0x0040 /* W */ 104 - #define RPCIF_SMWDR1 0x0044 /* W */ 105 - 106 - #define RPCIF_CMNSR 0x0048 /* R */ 107 - #define RPCIF_CMNSR_SSLF BIT(1) 108 - #define RPCIF_CMNSR_TEND BIT(0) 109 - 110 - #define RPCIF_DRDMCR 0x0058 /* R/W */ 111 - #define RPCIF_DMDMCR_DMCYC(v) ((((v) - 1) & 0x1F) << 0) 112 - 113 - #define RPCIF_DRDRENR 0x005C /* R/W */ 114 - #define RPCIF_DRDRENR_HYPE(v) (((v) & 0x7) << 12) 115 - #define RPCIF_DRDRENR_ADDRE BIT(8) 116 - #define RPCIF_DRDRENR_OPDRE BIT(4) 117 - #define RPCIF_DRDRENR_DRDRE BIT(0) 118 - 119 - #define RPCIF_SMDMCR 0x0060 /* R/W */ 120 - #define RPCIF_SMDMCR_DMCYC(v) ((((v) - 1) & 0x1F) << 0) 121 - 122 - #define RPCIF_SMDRENR 0x0064 /* R/W */ 123 - #define RPCIF_SMDRENR_HYPE(v) (((v) & 0x7) << 12) 124 - #define RPCIF_SMDRENR_ADDRE BIT(8) 125 - #define RPCIF_SMDRENR_OPDRE BIT(4) 126 - #define RPCIF_SMDRENR_SPIDRE BIT(0) 127 - 128 - #define RPCIF_PHYADD 0x0070 /* R/W available on R-Car E3/D3/V3M and RZ/G2{E,L} */ 129 - #define RPCIF_PHYWR 0x0074 /* R/W available on R-Car E3/D3/V3M and RZ/G2{E,L} */ 130 - 131 - #define RPCIF_PHYCNT 0x007C /* R/W */ 132 - #define RPCIF_PHYCNT_CAL BIT(31) 133 - #define RPCIF_PHYCNT_OCTA(v) (((v) & 0x3) << 22) 134 - #define RPCIF_PHYCNT_EXDS BIT(21) 135 - #define RPCIF_PHYCNT_OCT BIT(20) 136 - #define RPCIF_PHYCNT_DDRCAL BIT(19) 137 - #define RPCIF_PHYCNT_HS BIT(18) 138 - #define RPCIF_PHYCNT_CKSEL(v) (((v) & 0x3) << 16) /* valid only for RZ/G2L */ 139 - #define RPCIF_PHYCNT_STRTIM(v) (((v) & 0x7) << 15 | ((v) & 0x8) << 24) /* valid for R-Car and RZ/G2{E,H,M,N} */ 140 - 141 - #define RPCIF_PHYCNT_WBUF2 BIT(4) 142 - #define RPCIF_PHYCNT_WBUF BIT(2) 143 - #define RPCIF_PHYCNT_PHYMEM(v) (((v) & 0x3) << 0) 144 - #define RPCIF_PHYCNT_PHYMEM_MASK GENMASK(1, 0) 145 - 146 - #define RPCIF_PHYOFFSET1 0x0080 /* R/W */ 147 - #define RPCIF_PHYOFFSET1_DDRTMG(v) (((v) & 0x3) << 28) 148 - 149 - #define RPCIF_PHYOFFSET2 0x0084 /* R/W */ 150 - #define RPCIF_PHYOFFSET2_OCTTMG(v) (((v) & 0x7) << 8) 151 - 152 - #define RPCIF_PHYINT 0x0088 /* R/W */ 153 - #define RPCIF_PHYINT_WPVAL BIT(1) 21 + #include "renesas-rpc-if-regs.h" 22 + #include "renesas-xspi-if-regs.h" 154 23 155 24 static const struct regmap_range rpcif_volatile_ranges[] = { 156 25 regmap_reg_range(RPCIF_SMRDR0, RPCIF_SMRDR1), ··· 32 163 .n_yes_ranges = ARRAY_SIZE(rpcif_volatile_ranges), 33 164 }; 34 165 166 + static const struct regmap_range xspi_volatile_ranges[] = { 167 + regmap_reg_range(XSPI_CDD0BUF0, XSPI_CDD0BUF0), 168 + }; 169 + 170 + static const struct regmap_access_table xspi_volatile_table = { 171 + .yes_ranges = xspi_volatile_ranges, 172 + .n_yes_ranges = ARRAY_SIZE(xspi_volatile_ranges), 173 + }; 174 + 175 + struct rpcif_priv; 176 + 177 + struct rpcif_impl { 178 + int (*hw_init)(struct rpcif_priv *rpc, bool hyperflash); 179 + void (*prepare)(struct rpcif_priv *rpc, const struct rpcif_op *op, 180 + u64 *offs, size_t *len); 181 + int (*manual_xfer)(struct rpcif_priv *rpc); 182 + size_t (*dirmap_read)(struct rpcif_priv *rpc, u64 offs, size_t len, 183 + void *buf); 184 + u32 status_reg; 185 + u32 status_mask; 186 + }; 187 + 35 188 struct rpcif_info { 189 + const struct regmap_config *regmap_config; 190 + const struct rpcif_impl *impl; 36 191 enum rpcif_type type; 37 192 u8 strtim; 38 193 }; ··· 73 180 enum rpcif_data_dir dir; 74 181 u8 bus_size; 75 182 u8 xfer_size; 183 + u8 addr_nbytes; /* Specified for xSPI */ 184 + u32 proto; /* Specified for xSPI */ 76 185 void *buffer; 77 186 u32 xferlen; 78 187 u32 smcr; ··· 84 189 u32 enable; /* DRENR or SMENR */ 85 190 u32 dummy; /* DRDMCR or SMDMCR */ 86 191 u32 ddr; /* DRDRENR or SMDRENR */ 87 - }; 88 - 89 - static const struct rpcif_info rpcif_info_r8a7796 = { 90 - .type = RPCIF_RCAR_GEN3, 91 - .strtim = 6, 92 - }; 93 - 94 - static const struct rpcif_info rpcif_info_gen3 = { 95 - .type = RPCIF_RCAR_GEN3, 96 - .strtim = 7, 97 - }; 98 - 99 - static const struct rpcif_info rpcif_info_rz_g2l = { 100 - .type = RPCIF_RZ_G2L, 101 - .strtim = 7, 102 - }; 103 - 104 - static const struct rpcif_info rpcif_info_gen4 = { 105 - .type = RPCIF_RCAR_GEN4, 106 - .strtim = 15, 107 192 }; 108 193 109 194 /* ··· 175 300 .volatile_table = &rpcif_volatile_table, 176 301 }; 177 302 303 + static int xspi_reg_read(void *context, unsigned int reg, unsigned int *val) 304 + { 305 + struct rpcif_priv *xspi = context; 306 + 307 + *val = readl(xspi->base + reg); 308 + return 0; 309 + } 310 + 311 + static int xspi_reg_write(void *context, unsigned int reg, unsigned int val) 312 + { 313 + struct rpcif_priv *xspi = context; 314 + 315 + writel(val, xspi->base + reg); 316 + return 0; 317 + } 318 + 319 + static const struct regmap_config xspi_regmap_config = { 320 + .reg_bits = 32, 321 + .val_bits = 32, 322 + .reg_stride = 4, 323 + .reg_read = xspi_reg_read, 324 + .reg_write = xspi_reg_write, 325 + .fast_io = true, 326 + .max_register = XSPI_INTE, 327 + .volatile_table = &xspi_volatile_table, 328 + }; 329 + 178 330 int rpcif_sw_init(struct rpcif *rpcif, struct device *dev) 179 331 { 180 332 struct rpcif_priv *rpc = dev_get_drvdata(dev); ··· 209 307 rpcif->dev = dev; 210 308 rpcif->dirmap = rpc->dirmap; 211 309 rpcif->size = rpc->size; 310 + rpcif->xspi = rpc->info->type == XSPI_RZ_G3E; 212 311 return 0; 213 312 } 214 313 EXPORT_SYMBOL(rpcif_sw_init); ··· 228 325 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000032); 229 326 } 230 327 231 - int rpcif_hw_init(struct device *dev, bool hyperflash) 328 + static int rpcif_hw_init_impl(struct rpcif_priv *rpc, bool hyperflash) 232 329 { 233 - struct rpcif_priv *rpc = dev_get_drvdata(dev); 234 330 u32 dummy; 235 331 int ret; 236 - 237 - ret = pm_runtime_resume_and_get(dev); 238 - if (ret) 239 - return ret; 240 332 241 333 if (rpc->info->type == RPCIF_RZ_G2L) { 242 334 ret = reset_control_reset(rpc->rstc); ··· 280 382 regmap_write(rpc->regmap, RPCIF_SSLDR, RPCIF_SSLDR_SPNDL(7) | 281 383 RPCIF_SSLDR_SLNDL(7) | RPCIF_SSLDR_SCKDL(7)); 282 384 283 - pm_runtime_put(dev); 284 - 285 385 rpc->bus_size = hyperflash ? 2 : 1; 286 386 287 387 return 0; 388 + } 389 + 390 + static int xspi_hw_init_impl(struct rpcif_priv *xspi, bool hyperflash) 391 + { 392 + int ret; 393 + 394 + ret = reset_control_reset(xspi->rstc); 395 + if (ret) 396 + return ret; 397 + 398 + regmap_write(xspi->regmap, XSPI_WRAPCFG, 0x0); 399 + 400 + regmap_update_bits(xspi->regmap, XSPI_LIOCFGCS0, 401 + XSPI_LIOCFG_PRTMD(0x3ff) | XSPI_LIOCFG_CSMIN(0xf) | 402 + XSPI_LIOCFG_CSASTEX | XSPI_LIOCFG_CSNEGEX, 403 + XSPI_LIOCFG_PRTMD(0) | XSPI_LIOCFG_CSMIN(0) | 404 + XSPI_LIOCFG_CSASTEX | XSPI_LIOCFG_CSNEGEX); 405 + 406 + regmap_update_bits(xspi->regmap, XSPI_CCCTL0CS0, XSPI_CCCTL0_CAEN, 0); 407 + 408 + regmap_update_bits(xspi->regmap, XSPI_CDCTL0, 409 + XSPI_CDCTL0_TRREQ | XSPI_CDCTL0_CSSEL, 0); 410 + 411 + regmap_update_bits(xspi->regmap, XSPI_INTE, XSPI_INTE_CMDCMPE, 412 + XSPI_INTE_CMDCMPE); 413 + 414 + return 0; 415 + } 416 + 417 + int rpcif_hw_init(struct device *dev, bool hyperflash) 418 + { 419 + struct rpcif_priv *rpc = dev_get_drvdata(dev); 420 + int ret; 421 + 422 + ret = pm_runtime_resume_and_get(dev); 423 + if (ret) 424 + return ret; 425 + 426 + ret = rpc->info->impl->hw_init(rpc, hyperflash); 427 + 428 + pm_runtime_put(dev); 429 + 430 + return ret; 288 431 } 289 432 EXPORT_SYMBOL(rpcif_hw_init); 290 433 ··· 333 394 { 334 395 u32 sts; 335 396 336 - return regmap_read_poll_timeout(rpc->regmap, RPCIF_CMNSR, sts, 337 - sts & RPCIF_CMNSR_TEND, 0, 338 - USEC_PER_SEC); 397 + return regmap_read_poll_timeout(rpc->regmap, rpc->info->impl->status_reg, 398 + sts, sts & rpc->info->impl->status_mask, 399 + 0, USEC_PER_SEC); 339 400 } 340 401 341 402 static u8 rpcif_bits_set(struct rpcif_priv *rpc, u32 nbytes) ··· 351 412 return buswidth > 4 ? 2 : ilog2(buswidth); 352 413 } 353 414 354 - void rpcif_prepare(struct device *dev, const struct rpcif_op *op, u64 *offs, 355 - size_t *len) 415 + static void rpcif_prepare_impl(struct rpcif_priv *rpc, const struct rpcif_op *op, 416 + u64 *offs, size_t *len) 356 417 { 357 - struct rpcif_priv *rpc = dev_get_drvdata(dev); 358 - 359 418 rpc->smcr = 0; 360 419 rpc->smadr = 0; 361 420 rpc->enable = 0; ··· 434 497 rpc->enable |= RPCIF_SMENR_SPIDB(rpcif_bit_size(op->data.buswidth)); 435 498 } 436 499 } 437 - EXPORT_SYMBOL(rpcif_prepare); 438 500 439 - int rpcif_manual_xfer(struct device *dev) 501 + static void xspi_prepare_impl(struct rpcif_priv *xspi, const struct rpcif_op *op, 502 + u64 *offs, size_t *len) 503 + { 504 + xspi->smadr = 0; 505 + xspi->addr_nbytes = 0; 506 + xspi->command = 0; 507 + xspi->option = 0; 508 + xspi->dummy = 0; 509 + xspi->xferlen = 0; 510 + xspi->proto = 0; 511 + 512 + if (op->cmd.buswidth) 513 + xspi->command = op->cmd.opcode; 514 + 515 + if (op->ocmd.buswidth) 516 + xspi->command = (xspi->command << 8) | op->ocmd.opcode; 517 + 518 + if (op->addr.buswidth) { 519 + xspi->addr_nbytes = op->addr.nbytes; 520 + if (offs && len) 521 + xspi->smadr = *offs; 522 + else 523 + xspi->smadr = op->addr.val; 524 + } 525 + 526 + if (op->dummy.buswidth) 527 + xspi->dummy = op->dummy.ncycles; 528 + 529 + xspi->dir = op->data.dir; 530 + if (op->data.buswidth) { 531 + u32 nbytes; 532 + 533 + xspi->buffer = op->data.buf.in; 534 + 535 + if (offs && len) 536 + nbytes = *len; 537 + else 538 + nbytes = op->data.nbytes; 539 + xspi->xferlen = nbytes; 540 + } 541 + 542 + if (op->cmd.buswidth == 1) { 543 + if (op->addr.buswidth == 2 || op->data.buswidth == 2) 544 + xspi->proto = PROTO_1S_2S_2S; 545 + else if (op->addr.buswidth == 4 || op->data.buswidth == 4) 546 + xspi->proto = PROTO_1S_4S_4S; 547 + } else if (op->cmd.buswidth == 2 && 548 + (op->addr.buswidth == 2 || op->data.buswidth == 2)) { 549 + xspi->proto = PROTO_2S_2S_2S; 550 + } else if (op->cmd.buswidth == 4 && 551 + (op->addr.buswidth == 4 || op->data.buswidth == 4)) { 552 + xspi->proto = PROTO_4S_4S_4S; 553 + } 554 + } 555 + 556 + void rpcif_prepare(struct device *dev, const struct rpcif_op *op, u64 *offs, 557 + size_t *len) 440 558 { 441 559 struct rpcif_priv *rpc = dev_get_drvdata(dev); 560 + 561 + rpc->info->impl->prepare(rpc, op, offs, len); 562 + } 563 + EXPORT_SYMBOL(rpcif_prepare); 564 + 565 + static int rpcif_manual_xfer_impl(struct rpcif_priv *rpc) 566 + { 442 567 u32 smenr, smcr, pos = 0, max = rpc->bus_size == 2 ? 8 : 4; 443 568 int ret = 0; 444 - 445 - ret = pm_runtime_resume_and_get(dev); 446 - if (ret < 0) 447 - return ret; 448 569 449 570 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, 450 571 RPCIF_PHYCNT_CAL, RPCIF_PHYCNT_CAL); ··· 611 616 goto err_out; 612 617 } 613 618 614 - exit: 615 - pm_runtime_put(dev); 616 619 return ret; 617 620 618 621 err_out: 619 622 if (reset_control_reset(rpc->rstc)) 620 - dev_err(dev, "Failed to reset HW\n"); 621 - rpcif_hw_init(dev, rpc->bus_size == 2); 622 - goto exit; 623 + dev_err(rpc->dev, "Failed to reset HW\n"); 624 + rpcif_hw_init_impl(rpc, rpc->bus_size == 2); 625 + return ret; 626 + } 627 + 628 + static int xspi_manual_xfer_impl(struct rpcif_priv *xspi) 629 + { 630 + u32 pos = 0, max = 8; 631 + int ret = 0; 632 + 633 + regmap_update_bits(xspi->regmap, XSPI_CDCTL0, XSPI_CDCTL0_TRNUM(0x3), 634 + XSPI_CDCTL0_TRNUM(0)); 635 + 636 + regmap_update_bits(xspi->regmap, XSPI_CDCTL0, XSPI_CDCTL0_TRREQ, 0); 637 + 638 + regmap_write(xspi->regmap, XSPI_CDTBUF0, 639 + XSPI_CDTBUF_CMDSIZE(0x1) | XSPI_CDTBUF_CMD_FIELD(xspi->command)); 640 + 641 + regmap_write(xspi->regmap, XSPI_CDABUF0, 0); 642 + 643 + regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, XSPI_CDTBUF_ADDSIZE(0x7), 644 + XSPI_CDTBUF_ADDSIZE(xspi->addr_nbytes)); 645 + 646 + regmap_write(xspi->regmap, XSPI_CDABUF0, xspi->smadr); 647 + 648 + regmap_update_bits(xspi->regmap, XSPI_LIOCFGCS0, XSPI_LIOCFG_PRTMD(0x3ff), 649 + XSPI_LIOCFG_PRTMD(xspi->proto)); 650 + 651 + switch (xspi->dir) { 652 + case RPCIF_DATA_OUT: 653 + while (pos < xspi->xferlen) { 654 + u32 bytes_left = xspi->xferlen - pos; 655 + u32 nbytes, data[2], *p = data; 656 + 657 + regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, 658 + XSPI_CDTBUF_TRTYPE, XSPI_CDTBUF_TRTYPE); 659 + 660 + nbytes = bytes_left >= max ? max : bytes_left; 661 + 662 + regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, 663 + XSPI_CDTBUF_DATASIZE(0xf), 664 + XSPI_CDTBUF_DATASIZE(nbytes)); 665 + 666 + regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, 667 + XSPI_CDTBUF_ADDSIZE(0x7), 668 + XSPI_CDTBUF_ADDSIZE(xspi->addr_nbytes)); 669 + 670 + memcpy(data, xspi->buffer + pos, nbytes); 671 + 672 + if (nbytes > 4) { 673 + regmap_write(xspi->regmap, XSPI_CDD0BUF0, *p++); 674 + regmap_write(xspi->regmap, XSPI_CDD1BUF0, *p); 675 + } else { 676 + regmap_write(xspi->regmap, XSPI_CDD0BUF0, *p); 677 + } 678 + 679 + regmap_write(xspi->regmap, XSPI_CDABUF0, xspi->smadr + pos); 680 + 681 + regmap_update_bits(xspi->regmap, XSPI_CDCTL0, 682 + XSPI_CDCTL0_TRREQ, XSPI_CDCTL0_TRREQ); 683 + 684 + ret = wait_msg_xfer_end(xspi); 685 + if (ret) 686 + goto err_out; 687 + 688 + regmap_update_bits(xspi->regmap, XSPI_INTC, 689 + XSPI_INTC_CMDCMPC, XSPI_INTC_CMDCMPC); 690 + 691 + pos += nbytes; 692 + } 693 + regmap_update_bits(xspi->regmap, XSPI_CDCTL0, XSPI_CDCTL0_TRREQ, 0); 694 + break; 695 + case RPCIF_DATA_IN: 696 + while (pos < xspi->xferlen) { 697 + u32 bytes_left = xspi->xferlen - pos; 698 + u32 nbytes, data[2], *p = data; 699 + 700 + regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, 701 + XSPI_CDTBUF_TRTYPE, 702 + ~(u32)XSPI_CDTBUF_TRTYPE); 703 + 704 + /* nbytes can be up to 8 bytes */ 705 + nbytes = bytes_left >= max ? max : bytes_left; 706 + 707 + regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, 708 + XSPI_CDTBUF_DATASIZE(0xf), 709 + XSPI_CDTBUF_DATASIZE(nbytes)); 710 + 711 + regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, 712 + XSPI_CDTBUF_ADDSIZE(0x7), 713 + XSPI_CDTBUF_ADDSIZE(xspi->addr_nbytes)); 714 + 715 + if (xspi->addr_nbytes) 716 + regmap_write(xspi->regmap, XSPI_CDABUF0, 717 + xspi->smadr + pos); 718 + 719 + regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, 720 + XSPI_CDTBUF_LATE(0x1f), 721 + XSPI_CDTBUF_LATE(xspi->dummy)); 722 + 723 + regmap_update_bits(xspi->regmap, XSPI_CDCTL0, 724 + XSPI_CDCTL0_TRREQ, XSPI_CDCTL0_TRREQ); 725 + 726 + ret = wait_msg_xfer_end(xspi); 727 + if (ret) 728 + goto err_out; 729 + 730 + if (nbytes > 4) { 731 + regmap_read(xspi->regmap, XSPI_CDD0BUF0, p++); 732 + regmap_read(xspi->regmap, XSPI_CDD1BUF0, p); 733 + } else { 734 + regmap_read(xspi->regmap, XSPI_CDD0BUF0, p); 735 + } 736 + 737 + memcpy(xspi->buffer + pos, data, nbytes); 738 + 739 + regmap_update_bits(xspi->regmap, XSPI_INTC, 740 + XSPI_INTC_CMDCMPC, XSPI_INTC_CMDCMPC); 741 + 742 + pos += nbytes; 743 + } 744 + regmap_update_bits(xspi->regmap, XSPI_CDCTL0, 745 + XSPI_CDCTL0_TRREQ, 0); 746 + break; 747 + default: 748 + regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, 749 + XSPI_CDTBUF_TRTYPE, XSPI_CDTBUF_TRTYPE); 750 + regmap_update_bits(xspi->regmap, XSPI_CDCTL0, 751 + XSPI_CDCTL0_TRREQ, XSPI_CDCTL0_TRREQ); 752 + 753 + ret = wait_msg_xfer_end(xspi); 754 + if (ret) 755 + goto err_out; 756 + 757 + regmap_update_bits(xspi->regmap, XSPI_INTC, 758 + XSPI_INTC_CMDCMPC, XSPI_INTC_CMDCMPC); 759 + } 760 + 761 + return ret; 762 + 763 + err_out: 764 + xspi_hw_init_impl(xspi, false); 765 + return ret; 766 + } 767 + 768 + int rpcif_manual_xfer(struct device *dev) 769 + { 770 + struct rpcif_priv *rpc = dev_get_drvdata(dev); 771 + int ret; 772 + 773 + ret = pm_runtime_resume_and_get(dev); 774 + if (ret) 775 + return ret; 776 + 777 + ret = rpc->info->impl->manual_xfer(rpc); 778 + 779 + pm_runtime_put(dev); 780 + 781 + return ret; 623 782 } 624 783 EXPORT_SYMBOL(rpcif_manual_xfer); 625 784 ··· 819 670 } 820 671 } 821 672 822 - ssize_t rpcif_dirmap_read(struct device *dev, u64 offs, size_t len, void *buf) 673 + static size_t rpcif_dirmap_read_impl(struct rpcif_priv *rpc, u64 offs, 674 + size_t len, void *buf) 823 675 { 824 - struct rpcif_priv *rpc = dev_get_drvdata(dev); 825 676 loff_t from = offs & (rpc->size - 1); 826 677 size_t size = rpc->size - from; 827 - int ret; 828 678 829 679 if (len > size) 830 680 len = size; 831 - 832 - ret = pm_runtime_resume_and_get(dev); 833 - if (ret < 0) 834 - return ret; 835 681 836 682 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, RPCIF_CMNCR_MD, 0); 837 683 regmap_write(rpc->regmap, RPCIF_DRCR, 0); ··· 844 700 else 845 701 memcpy_fromio(buf, rpc->dirmap + from, len); 846 702 847 - pm_runtime_put(dev); 703 + return len; 704 + } 705 + 706 + static size_t xspi_dirmap_read_impl(struct rpcif_priv *xspi, u64 offs, 707 + size_t len, void *buf) 708 + { 709 + loff_t from = offs & (xspi->size - 1); 710 + size_t size = xspi->size - from; 711 + u8 addsize = xspi->addr_nbytes - 1; 712 + 713 + if (len > size) 714 + len = size; 715 + 716 + regmap_update_bits(xspi->regmap, XSPI_CMCFG0CS0, 717 + XSPI_CMCFG0_FFMT(0x3) | XSPI_CMCFG0_ADDSIZE(0x3), 718 + XSPI_CMCFG0_FFMT(0) | XSPI_CMCFG0_ADDSIZE(addsize)); 719 + 720 + regmap_update_bits(xspi->regmap, XSPI_CMCFG1CS0, 721 + XSPI_CMCFG1_RDCMD(0xffff) | XSPI_CMCFG1_RDLATE(0x1f), 722 + XSPI_CMCFG1_RDCMD_UPPER_BYTE(xspi->command) | 723 + XSPI_CMCFG1_RDLATE(xspi->dummy)); 724 + 725 + regmap_update_bits(xspi->regmap, XSPI_BMCTL0, XSPI_BMCTL0_CS0ACC(0xff), 726 + XSPI_BMCTL0_CS0ACC(0x01)); 727 + 728 + regmap_update_bits(xspi->regmap, XSPI_BMCFG, 729 + XSPI_BMCFG_WRMD | XSPI_BMCFG_MWRCOMB | 730 + XSPI_BMCFG_MWRSIZE(0xff) | XSPI_BMCFG_PREEN, 731 + 0 | XSPI_BMCFG_MWRCOMB | XSPI_BMCFG_MWRSIZE(0x0f) | 732 + XSPI_BMCFG_PREEN); 733 + 734 + regmap_update_bits(xspi->regmap, XSPI_LIOCFGCS0, XSPI_LIOCFG_PRTMD(0x3ff), 735 + XSPI_LIOCFG_PRTMD(xspi->proto)); 736 + 737 + memcpy_fromio(buf, xspi->dirmap + from, len); 848 738 849 739 return len; 850 740 } 741 + 742 + ssize_t rpcif_dirmap_read(struct device *dev, u64 offs, size_t len, void *buf) 743 + { 744 + struct rpcif_priv *rpc = dev_get_drvdata(dev); 745 + size_t read; 746 + int ret; 747 + 748 + ret = pm_runtime_resume_and_get(dev); 749 + if (ret) 750 + return ret; 751 + 752 + read = rpc->info->impl->dirmap_read(rpc, offs, len, buf); 753 + 754 + pm_runtime_put(dev); 755 + 756 + return read; 757 + } 851 758 EXPORT_SYMBOL(rpcif_dirmap_read); 759 + 760 + /** 761 + * xspi_dirmap_write - Write data to xspi memory. 762 + * @dev: xspi device 763 + * @offs: offset 764 + * @len: Number of bytes to be written. 765 + * @buf: Buffer holding write data. 766 + * 767 + * This function writes data into xspi memory. 768 + * 769 + * Returns number of bytes written on success, else negative errno. 770 + */ 771 + ssize_t xspi_dirmap_write(struct device *dev, u64 offs, size_t len, const void *buf) 772 + { 773 + struct rpcif_priv *xspi = dev_get_drvdata(dev); 774 + loff_t from = offs & (xspi->size - 1); 775 + u8 addsize = xspi->addr_nbytes - 1; 776 + size_t size = xspi->size - from; 777 + ssize_t writebytes; 778 + int ret; 779 + 780 + ret = pm_runtime_resume_and_get(dev); 781 + if (ret) 782 + return ret; 783 + 784 + if (len > size) 785 + len = size; 786 + 787 + if (len > MWRSIZE_MAX) 788 + writebytes = MWRSIZE_MAX; 789 + else 790 + writebytes = len; 791 + 792 + regmap_update_bits(xspi->regmap, XSPI_CMCFG0CS0, 793 + XSPI_CMCFG0_FFMT(0x3) | XSPI_CMCFG0_ADDSIZE(0x3), 794 + XSPI_CMCFG0_FFMT(0) | XSPI_CMCFG0_ADDSIZE(addsize)); 795 + 796 + regmap_update_bits(xspi->regmap, XSPI_CMCFG2CS0, 797 + XSPI_CMCFG2_WRCMD_UPPER(0xff) | XSPI_CMCFG2_WRLATE(0x1f), 798 + XSPI_CMCFG2_WRCMD_UPPER(xspi->command) | 799 + XSPI_CMCFG2_WRLATE(xspi->dummy)); 800 + 801 + regmap_update_bits(xspi->regmap, XSPI_BMCTL0, 802 + XSPI_BMCTL0_CS0ACC(0xff), XSPI_BMCTL0_CS0ACC(0x03)); 803 + 804 + regmap_update_bits(xspi->regmap, XSPI_BMCFG, 805 + XSPI_BMCFG_WRMD | XSPI_BMCFG_MWRCOMB | 806 + XSPI_BMCFG_MWRSIZE(0xff) | XSPI_BMCFG_PREEN, 807 + 0 | XSPI_BMCFG_MWRCOMB | XSPI_BMCFG_MWRSIZE(0x0f) | 808 + XSPI_BMCFG_PREEN); 809 + 810 + regmap_update_bits(xspi->regmap, XSPI_LIOCFGCS0, XSPI_LIOCFG_PRTMD(0x3ff), 811 + XSPI_LIOCFG_PRTMD(xspi->proto)); 812 + 813 + memcpy_toio(xspi->dirmap + from, buf, writebytes); 814 + 815 + /* Request to push the pending data */ 816 + if (writebytes < MWRSIZE_MAX) 817 + regmap_update_bits(xspi->regmap, XSPI_BMCTL1, 818 + XSPI_BMCTL1_MWRPUSH, XSPI_BMCTL1_MWRPUSH); 819 + 820 + pm_runtime_put(dev); 821 + 822 + return writebytes; 823 + } 824 + EXPORT_SYMBOL_GPL(xspi_dirmap_write); 852 825 853 826 static int rpcif_probe(struct platform_device *pdev) 854 827 { ··· 1001 740 rpc->base = devm_platform_ioremap_resource_byname(pdev, "regs"); 1002 741 if (IS_ERR(rpc->base)) 1003 742 return PTR_ERR(rpc->base); 1004 - 1005 - rpc->regmap = devm_regmap_init(dev, NULL, rpc, &rpcif_regmap_config); 743 + rpc->info = of_device_get_match_data(dev); 744 + rpc->regmap = devm_regmap_init(dev, NULL, rpc, rpc->info->regmap_config); 1006 745 if (IS_ERR(rpc->regmap)) { 1007 746 dev_err(dev, "failed to init regmap for rpcif, error %ld\n", 1008 747 PTR_ERR(rpc->regmap)); ··· 1015 754 return PTR_ERR(rpc->dirmap); 1016 755 1017 756 rpc->size = resource_size(res); 1018 - rpc->info = of_device_get_match_data(dev); 1019 - rpc->rstc = devm_reset_control_get_exclusive(dev, NULL); 757 + rpc->rstc = devm_reset_control_array_get_exclusive(dev); 1020 758 if (IS_ERR(rpc->rstc)) 1021 759 return PTR_ERR(rpc->rstc); 760 + 761 + /* 762 + * The enabling/disabling of spi/spix2 clocks at runtime leading to 763 + * flash write failure. So, enable these clocks during probe() and 764 + * disable it in remove(). 765 + */ 766 + if (rpc->info->type == XSPI_RZ_G3E) { 767 + struct clk *spi_clk; 768 + 769 + spi_clk = devm_clk_get_enabled(dev, "spix2"); 770 + if (IS_ERR(spi_clk)) 771 + return dev_err_probe(dev, PTR_ERR(spi_clk), 772 + "cannot get enabled spix2 clk\n"); 773 + 774 + spi_clk = devm_clk_get_enabled(dev, "spi"); 775 + if (IS_ERR(spi_clk)) 776 + return dev_err_probe(dev, PTR_ERR(spi_clk), 777 + "cannot get enabled spi clk\n"); 778 + } 1022 779 1023 780 vdev = platform_device_alloc(name, pdev->id); 1024 781 if (!vdev) ··· 1063 784 platform_device_unregister(rpc->vdev); 1064 785 } 1065 786 787 + static const struct rpcif_impl rpcif_impl = { 788 + .hw_init = rpcif_hw_init_impl, 789 + .prepare = rpcif_prepare_impl, 790 + .manual_xfer = rpcif_manual_xfer_impl, 791 + .dirmap_read = rpcif_dirmap_read_impl, 792 + .status_reg = RPCIF_CMNSR, 793 + .status_mask = RPCIF_CMNSR_TEND, 794 + }; 795 + 796 + static const struct rpcif_impl xspi_impl = { 797 + .hw_init = xspi_hw_init_impl, 798 + .prepare = xspi_prepare_impl, 799 + .manual_xfer = xspi_manual_xfer_impl, 800 + .dirmap_read = xspi_dirmap_read_impl, 801 + .status_reg = XSPI_INTS, 802 + .status_mask = XSPI_INTS_CMDCMP, 803 + }; 804 + 805 + static const struct rpcif_info rpcif_info_r8a7796 = { 806 + .regmap_config = &rpcif_regmap_config, 807 + .impl = &rpcif_impl, 808 + .type = RPCIF_RCAR_GEN3, 809 + .strtim = 6, 810 + }; 811 + 812 + static const struct rpcif_info rpcif_info_gen3 = { 813 + .regmap_config = &rpcif_regmap_config, 814 + .impl = &rpcif_impl, 815 + .type = RPCIF_RCAR_GEN3, 816 + .strtim = 7, 817 + }; 818 + 819 + static const struct rpcif_info rpcif_info_rz_g2l = { 820 + .regmap_config = &rpcif_regmap_config, 821 + .impl = &rpcif_impl, 822 + .type = RPCIF_RZ_G2L, 823 + .strtim = 7, 824 + }; 825 + 826 + static const struct rpcif_info rpcif_info_gen4 = { 827 + .regmap_config = &rpcif_regmap_config, 828 + .impl = &rpcif_impl, 829 + .type = RPCIF_RCAR_GEN4, 830 + .strtim = 15, 831 + }; 832 + 833 + static const struct rpcif_info xspi_info_r9a09g047 = { 834 + .regmap_config = &xspi_regmap_config, 835 + .impl = &xspi_impl, 836 + .type = XSPI_RZ_G3E, 837 + }; 838 + 1066 839 static const struct of_device_id rpcif_of_match[] = { 1067 840 { .compatible = "renesas,r8a7796-rpc-if", .data = &rpcif_info_r8a7796 }, 841 + { .compatible = "renesas,r9a09g047-xspi", .data = &xspi_info_r9a09g047 }, 1068 842 { .compatible = "renesas,rcar-gen3-rpc-if", .data = &rpcif_info_gen3 }, 1069 843 { .compatible = "renesas,rcar-gen4-rpc-if", .data = &rpcif_info_gen4 }, 1070 844 { .compatible = "renesas,rzg2l-rpc-if", .data = &rpcif_info_rz_g2l },
+105
drivers/memory/renesas-xspi-if-regs.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 */ 2 + /* 3 + * RZ xSPI Interface Registers Definitions 4 + * 5 + * Copyright (C) 2025 Renesas Electronics Corporation 6 + */ 7 + 8 + #ifndef __RENESAS_XSPI_IF_REGS_H__ 9 + #define __RENESAS_XSPI_IF_REGS_H__ 10 + 11 + #include <linux/bits.h> 12 + 13 + /* xSPI Wrapper Configuration Register */ 14 + #define XSPI_WRAPCFG 0x0000 15 + 16 + /* xSPI Bridge Configuration Register */ 17 + #define XSPI_BMCFG 0x0008 18 + #define XSPI_BMCFG_WRMD BIT(0) 19 + #define XSPI_BMCFG_MWRCOMB BIT(7) 20 + #define XSPI_BMCFG_MWRSIZE(val) (((val) & 0xff) << 8) 21 + #define XSPI_BMCFG_PREEN BIT(16) 22 + 23 + /* xSPI Command Map Configuration Register 0 CS0 */ 24 + #define XSPI_CMCFG0CS0 0x0010 25 + #define XSPI_CMCFG0_FFMT(val) (((val) & 0x03) << 0) 26 + #define XSPI_CMCFG0_ADDSIZE(val) (((val) & 0x03) << 2) 27 + 28 + /* xSPI Command Map Configuration Register 1 CS0 */ 29 + #define XSPI_CMCFG1CS0 0x0014 30 + #define XSPI_CMCFG1_RDCMD(val) (((val) & 0xffff) << 0) 31 + #define XSPI_CMCFG1_RDCMD_UPPER_BYTE(val) (((val) & 0xff) << 8) 32 + #define XSPI_CMCFG1_RDLATE(val) (((val) & 0x1f) << 16) 33 + 34 + /* xSPI Command Map Configuration Register 2 CS0 */ 35 + #define XSPI_CMCFG2CS0 0x0018 36 + #define XSPI_CMCFG2_WRCMD(val) (((val) & 0xffff) << 0) 37 + #define XSPI_CMCFG2_WRCMD_UPPER(val) (((val) & 0xff) << 8) 38 + #define XSPI_CMCFG2_WRLATE(val) (((val) & 0x1f) << 16) 39 + 40 + /* xSPI Link I/O Configuration Register CS0 */ 41 + #define XSPI_LIOCFGCS0 0x0050 42 + #define XSPI_LIOCFG_PRTMD(val) (((val) & 0x3ff) << 0) 43 + #define XSPI_LIOCFG_CSMIN(val) (((val) & 0x0f) << 16) 44 + #define XSPI_LIOCFG_CSASTEX BIT(20) 45 + #define XSPI_LIOCFG_CSNEGEX BIT(21) 46 + 47 + /* xSPI Bridge Map Control Register 0 */ 48 + #define XSPI_BMCTL0 0x0060 49 + #define XSPI_BMCTL0_CS0ACC(val) (((val) & 0x03) << 0) 50 + 51 + /* xSPI Bridge Map Control Register 1 */ 52 + #define XSPI_BMCTL1 0x0064 53 + #define XSPI_BMCTL1_MWRPUSH BIT(8) 54 + 55 + /* xSPI Command Manual Control Register 0 */ 56 + #define XSPI_CDCTL0 0x0070 57 + #define XSPI_CDCTL0_TRREQ BIT(0) 58 + #define XSPI_CDCTL0_CSSEL BIT(3) 59 + #define XSPI_CDCTL0_TRNUM(val) (((val) & 0x03) << 4) 60 + 61 + /* xSPI Command Manual Type Buf */ 62 + #define XSPI_CDTBUF0 0x0080 63 + #define XSPI_CDTBUF_CMDSIZE(val) (((val) & 0x03) << 0) 64 + #define XSPI_CDTBUF_ADDSIZE(val) (((val) & 0x07) << 2) 65 + #define XSPI_CDTBUF_DATASIZE(val) (((val) & 0x0f) << 5) 66 + #define XSPI_CDTBUF_LATE(val) (((val) & 0x1f) << 9) 67 + #define XSPI_CDTBUF_TRTYPE BIT(15) 68 + #define XSPI_CDTBUF_CMD(val) (((val) & 0xffff) << 16) 69 + #define XSPI_CDTBUF_CMD_FIELD(val) (((val) & 0xff) << 24) 70 + 71 + /* xSPI Command Manual Address Buff */ 72 + #define XSPI_CDABUF0 0x0084 73 + 74 + /* xSPI Command Manual Data 0 Buf */ 75 + #define XSPI_CDD0BUF0 0x0088 76 + 77 + /* xSPI Command Manual Data 1 Buf */ 78 + #define XSPI_CDD1BUF0 0x008c 79 + 80 + /* xSPI Command Calibration Control Register 0 CS0 */ 81 + #define XSPI_CCCTL0CS0 0x0130 82 + #define XSPI_CCCTL0_CAEN BIT(0) 83 + 84 + /* xSPI Interrupt Status Register */ 85 + #define XSPI_INTS 0x0190 86 + #define XSPI_INTS_CMDCMP BIT(0) 87 + 88 + /* xSPI Interrupt Clear Register */ 89 + #define XSPI_INTC 0x0194 90 + #define XSPI_INTC_CMDCMPC BIT(0) 91 + 92 + /* xSPI Interrupt Enable Register */ 93 + #define XSPI_INTE 0x0198 94 + #define XSPI_INTE_CMDCMPE BIT(0) 95 + 96 + /* Maximum data size of MWRSIZE*/ 97 + #define MWRSIZE_MAX 64 98 + 99 + /* xSPI Protocol mode */ 100 + #define PROTO_1S_2S_2S 0x48 101 + #define PROTO_2S_2S_2S 0x49 102 + #define PROTO_1S_4S_4S 0x090 103 + #define PROTO_4S_4S_4S 0x092 104 + 105 + #endif /* __RENESAS_XSPI_IF_REGS_H__ */
+4
include/memory/renesas-rpc-if.h
··· 61 61 RPCIF_RCAR_GEN3, 62 62 RPCIF_RCAR_GEN4, 63 63 RPCIF_RZ_G2L, 64 + XSPI_RZ_G3E, 64 65 }; 65 66 66 67 struct rpcif { 67 68 struct device *dev; 68 69 void __iomem *dirmap; 69 70 size_t size; 71 + bool xspi; 70 72 }; 71 73 72 74 int rpcif_sw_init(struct rpcif *rpc, struct device *dev); ··· 77 75 size_t *len); 78 76 int rpcif_manual_xfer(struct device *dev); 79 77 ssize_t rpcif_dirmap_read(struct device *dev, u64 offs, size_t len, void *buf); 78 + ssize_t xspi_dirmap_write(struct device *dev, u64 offs, size_t len, 79 + const void *buf); 80 80 81 81 #endif // __RENESAS_RPC_IF_H