1 /*
2 * Copyright (c) 2024 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 /*
8 * This header is part of mspi_dw.c extracted only for clarity.
9 * It is not supposed to be included by any file other than mspi_dw.c.
10 */
11
12 /* CTRLR0 - Control Register 0 */
13 #define CTRLR0_SPI_FRF_MASK GENMASK(23, 22)
14 #define CTRLR0_SPI_FRF_STANDARD 0UL
15 #define CTRLR0_SPI_FRF_DUAL 1UL
16 #define CTRLR0_SPI_FRF_QUAD 2UL
17 #define CTRLR0_SPI_FRF_OCTAL 3UL
18 #define CTRLR0_TMOD_MASK GENMASK(11, 10)
19 #define CTRLR0_TMOD_TX_RX 0UL
20 #define CTRLR0_TMOD_TX 1UL
21 #define CTRLR0_TMOD_RX 2UL
22 #define CTRLR0_TMOD_EEPROM 3UL
23 #define CTRLR0_SCPOL_BIT BIT(9)
24 #define CTRLR0_SCPH_BIT BIT(8)
25 #define CTRLR0_FRF_MASK GENMASK(7, 6)
26 #define CTRLR0_FRF_SPI 0UL
27 #define CTRLR0_FRF_SSP 1UL
28 #define CTRLR0_FRF_MICROWIRE 2UL
29 #define CTRLR0_DFS_MASK GENMASK(4, 0)
30
31 /* CTRLR1- Control Register 1 */
32 #define CTRLR1_NDF_MASK GENMASK(15, 0)
33
34 /* SSIENR - SSI Enable Register */
35 #define SSIENR_SSIC_EN_BIT BIT(0)
36
37 /* TXFTLR - Transmit FIFO Threshold Level */
38 #define TXFTLR_TXFTHR_MASK GENMASK(23, 16)
39 #define TXFTLR_TFT_MASK GENMASK(7, 0)
40
41 /* RXFTLR - Receive FIFO Threshold Level */
42 #define RXFTLR_RFT_MASK GENMASK(7, 0)
43
44 /* TXFLR - Transmit FIFO Level Register */
45 #define TXFLR_TXTFL_MASK GENMASK(7, 0)
46
47 /* RXFLR - Receive FIFO Level Register */
48 #define RXFLR_RXTFL_MASK GENMASK(7, 0)
49
50 /* SR - Status Register */
51 #define SR_BUSY_BIT BIT(0)
52
53 /* IMR - Interrupt Mask Register */
54 #define IMR_TXEIM_BIT BIT(0)
55 #define IMR_TXOIM_BIT BIT(1)
56 #define IMR_RXUIM_BIT BIT(2)
57 #define IMR_RXOIM_BIT BIT(3)
58 #define IMR_RXFIM_BIT BIT(4)
59 #define IMR_MSTIM_BIT BIT(5)
60
61 /* ISR - Interrupt Status Register */
62 #define ISR_TXEIS_BIT BIT(0)
63 #define ISR_TXOIS_BIT BIT(1)
64 #define ISR_RXUIS_BIT BIT(2)
65 #define ISR_RXOIS_BIT BIT(3)
66 #define ISR_RXFIS_BIT BIT(4)
67 #define ISR_MSTIS_BIT BIT(5)
68
69 /* SPI_CTRLR0 - SPI Control Register */
70 #define SPI_CTRLR0_CLK_STRETCH_EN_BIT BIT(30)
71 #define SPI_CTRLR0_XIP_PREFETCH_EN_BIT BIT(29)
72 #define SPI_CTRLR0_XIP_MBL_BIT BIT(26)
73 #define SPI_CTRLR0_SPI_RXDS_SIG_EN_BIT BIT(25)
74 #define SPI_CTRLR0_SPI_DM_EN_BIT BIT(24)
75 #define SPI_CTRLR0_RXDS_VL_EN_BIT BIT(23)
76 #define SPI_CTRLR0_SSIC_XIP_CONT_XFER_EN_BIT BIT(21)
77 #define SPI_CTRLR0_XIP_INST_EN_BIT BIT(20)
78 #define SPI_CTRLR0_XIP_DFS_HC_BIT BIT(19)
79 #define SPI_CTRLR0_SPI_RXDS_EN_BIT BIT(18)
80 #define SPI_CTRLR0_INST_DDR_EN_BIT BIT(17)
81 #define SPI_CTRLR0_SPI_DDR_EN_BIT BIT(16)
82 #define SPI_CTRLR0_WAIT_CYCLES_MASK GENMASK(15, 11)
83 #define SPI_CTRLR0_WAIT_CYCLES_MAX BIT_MASK(5)
84 #define SPI_CTRLR0_INST_L_MASK GENMASK(9, 8)
85 #define SPI_CTRLR0_INST_L0 0UL
86 #define SPI_CTRLR0_INST_L4 1UL
87 #define SPI_CTRLR0_INST_L8 2UL
88 #define SPI_CTRLR0_INST_L16 3UL
89 #define SPI_CTRLR0_XIP_MD_BIT_EN_BIT BIT(7)
90 #define SPI_CTRLR0_ADDR_L_MASK GENMASK(5, 2)
91 #define SPI_CTRLR0_TRANS_TYPE_MASK GENMASK(1, 0)
92 #define SPI_CTRLR0_TRANS_TYPE_TT0 0UL
93 #define SPI_CTRLR0_TRANS_TYPE_TT1 1UL
94 #define SPI_CTRLR0_TRANS_TYPE_TT2 2UL
95 #define SPI_CTRLR0_TRANS_TYPE_TT3 3UL
96
97 /* XIP_CTRL - XIP Control Register */
98 #define XIP_CTRL_XIP_PREFETCH_EN_BIT BIT(28)
99 #define XIP_CTRL_XIP_MBL_MASK GENMASK(27, 26)
100 #define XIP_CTRL_XIP_MBL_2 0UL
101 #define XIP_CTRL_XIP_MBL_4 1UL
102 #define XIP_CTRL_XIP_MBL_8 2UL
103 #define XIP_CTRL_XIP_MBL_16 3UL
104 #define XIP_CTRL_RXDS_SIG_EN_BIT BIT(25)
105 #define XIP_CTRL_XIP_HYBERBUS_EN_BIT BIT(24)
106 #define XIP_CTRL_CONT_XFER_EN_BIT BIT(23)
107 #define XIP_CTRL_INST_EN_BIT BIT(22)
108 #define XIP_CTRL_RXDS_EN_BIT BIT(21)
109 #define XIP_CTRL_INST_DDR_EN_BIT BIT(20)
110 #define XIP_CTRL_DDR_EN_BIT BIT(19)
111 #define XIP_CTRL_DFS_HC_BIT BIT(18)
112 #define XIP_CTRL_WAIT_CYCLES_MASK GENMASK(17, 13)
113 #define XIP_CTRL_WAIT_CYCLES_MAX BIT_MASK(5)
114 #define XIP_CTRL_MD_BITS_EN_BIT BIT(12)
115 #define XIP_CTRL_INST_L_MASK GENMASK(10, 9)
116 #define XIP_CTRL_INST_L0 0UL
117 #define XIP_CTRL_INST_L4 1UL
118 #define XIP_CTRL_INST_L8 2UL
119 #define XIP_CTRL_INST_L16 3UL
120 #define XIP_CTRL_ADDR_L_MASK GENMASK(7, 4)
121 #define XIP_CTRL_TRANS_TYPE_MASK GENMASK(3, 2)
122 #define XIP_CTRL_TRANS_TYPE_TT0 0UL
123 #define XIP_CTRL_TRANS_TYPE_TT1 1UL
124 #define XIP_CTRL_TRANS_TYPE_TT2 2UL
125 #define XIP_CTRL_FRF_MASK GENMASK(1, 0)
126 #define XIP_CTRL_FRF_DUAL 1UL
127 #define XIP_CTRL_FRF_QUAD 2UL
128 #define XIP_CTRL_FRF_OCTAL 3UL
129
130 /* XIP_CTRL - XIP Control Register */
131 #define XIP_CTRL_XIP_PREFETCH_EN_BIT BIT(28)
132 #define XIP_CTRL_XIP_MBL_MASK GENMASK(27, 26)
133 #define XIP_CTRL_XIP_MBL_2 0UL
134 #define XIP_CTRL_XIP_MBL_4 1UL
135 #define XIP_CTRL_XIP_MBL_8 2UL
136 #define XIP_CTRL_XIP_MBL_16 3UL
137 #define XIP_CTRL_XIP_HYBERBUS_EN_BIT BIT(24)
138 #define XIP_CTRL_CONT_XFER_EN_BIT BIT(23)
139 #define XIP_CTRL_INST_EN_BIT BIT(22)
140 #define XIP_CTRL_RXDS_EN_BIT BIT(21)
141 #define XIP_CTRL_INST_DDR_EN_BIT BIT(20)
142 #define XIP_CTRL_DDR_EN_BIT BIT(19)
143 #define XIP_CTRL_DFS_HC_BIT BIT(18)
144
145 /* XIP_WRITE_CTRL - XIP Write Control Register */
146 #define XIP_WRITE_CTRL_WAIT_CYCLES_MASK GENMASK(20, 16)
147 #define XIP_WRITE_CTRL_WAIT_CYCLES_MAX BIT_MASK(5)
148 #define XIP_WRITE_CTRL_RXDS_SIG_EN_BIT BIT(13)
149 #define XIP_WRITE_CTRL_HYBERBUS_EN_BIT BIT(12)
150 #define XIP_WRITE_CTRL_INST_DDR_EN_BIT BIT(11)
151 #define XIP_WRITE_CTRL_SPI_DDR_EN_BIT BIT(10)
152 #define XIP_WRITE_CTRL_INST_L_MASK GENMASK(9, 8)
153 #define XIP_WRITE_CTRL_INST_L0 0UL
154 #define XIP_WRITE_CTRL_INST_L4 1UL
155 #define XIP_WRITE_CTRL_INST_L8 2UL
156 #define XIP_WRITE_CTRL_INST_L16 3UL
157 #define XIP_WRITE_CTRL_ADDR_L_MASK GENMASK(7, 4)
158 #define XIP_WRITE_CTRL_TRANS_TYPE_MASK GENMASK(3, 2)
159 #define XIP_WRITE_CTRL_TRANS_TYPE_TT0 0UL
160 #define XIP_WRITE_CTRL_TRANS_TYPE_TT1 1UL
161 #define XIP_WRITE_CTRL_TRANS_TYPE_TT2 2UL
162 #define XIP_WRITE_CTRL_FRF_MASK GENMASK(1, 0)
163 #define XIP_WRITE_CTRL_FRF_DUAL 1UL
164 #define XIP_WRITE_CTRL_FRF_QUAD 2UL
165 #define XIP_WRITE_CTRL_FRF_OCTAL 3UL
166
167 /* Register access helpers. */
168 #define USES_AUX_REG(inst) + DT_INST_PROP(inst, aux_reg_enable)
169 #define AUX_REG_INSTANCES (0 DT_INST_FOREACH_STATUS_OKAY(USES_AUX_REG))
170 #define BASE_ADDR(dev) (mm_reg_t)DEVICE_MMIO_GET(dev)
171
172 #if AUX_REG_INSTANCES != 0
aux_reg_read(const struct device * dev,uint32_t off)173 static uint32_t aux_reg_read(const struct device *dev, uint32_t off)
174 {
175 return sys_in32(BASE_ADDR(dev) + off/4);
176 }
aux_reg_write(uint32_t data,const struct device * dev,uint32_t off)177 static void aux_reg_write(uint32_t data, const struct device *dev, uint32_t off)
178 {
179 sys_out32(data, BASE_ADDR(dev) + off/4);
180 }
181 #endif
182
183 #if AUX_REG_INSTANCES != DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT)
reg_read(const struct device * dev,uint32_t off)184 static uint32_t reg_read(const struct device *dev, uint32_t off)
185 {
186 return sys_read32(BASE_ADDR(dev) + off);
187 }
reg_write(uint32_t data,const struct device * dev,uint32_t off)188 static void reg_write(uint32_t data, const struct device *dev, uint32_t off)
189 {
190 sys_write32(data, BASE_ADDR(dev) + off);
191 }
192 #endif
193
194 #if AUX_REG_INSTANCES == 0
195 /* If no instance uses aux-reg access. */
196 #define DECLARE_REG_ACCESS()
197 #define DEFINE_REG_ACCESS(inst)
198 #define DEFINE_MM_REG_RD(reg, off) \
199 static inline uint32_t read_##reg(const struct device *dev) \
200 { return reg_read(dev, off); }
201 #define DEFINE_MM_REG_WR(reg, off) \
202 static inline void write_##reg(const struct device *dev, uint32_t data) \
203 { reg_write(data, dev, off); }
204
205 #elif AUX_REG_INSTANCES == DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT)
206 /* If all instances use aux-reg access. */
207 #define DECLARE_REG_ACCESS()
208 #define DEFINE_REG_ACCESS(inst)
209 #define DEFINE_MM_REG_RD(reg, off) \
210 static inline uint32_t read_##reg(const struct device *dev) \
211 { return aux_reg_read(dev, off); }
212 #define DEFINE_MM_REG_WR(reg, off) \
213 static inline void write_##reg(const struct device *dev, uint32_t data) \
214 { aux_reg_write(data, dev, off); }
215
216 #else
217 /* If register access varies by instance. */
218 #define DECLARE_REG_ACCESS() \
219 uint32_t (*read)(const struct device *dev, uint32_t off); \
220 void (*write)(uint32_t data, const struct device *dev, uint32_t off)
221 #define DEFINE_REG_ACCESS(inst) \
222 COND_CODE_1(DT_INST_PROP(inst, aux_reg_enable), \
223 (.read = aux_reg_read, \
224 .write = aux_reg_write,), \
225 (.read = reg_read, \
226 .write = reg_write,))
227 #define DEFINE_MM_REG_RD(reg, off) \
228 static inline uint32_t read_##reg(const struct device *dev) \
229 { \
230 const struct mspi_dw_config *dev_config = dev->config; \
231 return dev_config->read(dev, off); \
232 }
233 #define DEFINE_MM_REG_WR(reg, off) \
234 static inline void write_##reg(const struct device *dev, uint32_t data) \
235 { \
236 const struct mspi_dw_config *dev_config = dev->config; \
237 dev_config->write(data, dev, off); \
238 }
239 #endif
240