Skip to content

Commit 09fd04d

Browse files
committed
Add RZ/G3E xSPI support
Merge series from Biju Das <[email protected]>: The xSPI IP found on RZ/G3E SoC similar to RPC-IF interface, but it can support writes on memory-mapped area. Even though the registers are different, the rpcif driver code can be reused for xSPI by adding wrapper functions.
2 parents 9fbae05 + b0b8d3a commit 09fd04d

File tree

6 files changed

+929
-192
lines changed

6 files changed

+929
-192
lines changed
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
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 <[email protected]>
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+
};

drivers/memory/renesas-rpc-if-regs.h

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
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__ */

0 commit comments

Comments
 (0)