1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
|
// SPDX-License-Identifier: BSD-1-Clause
/*
* Chip-specific header file for the SAMA5D2 family
*
* Copyright (c) 2015, Atmel Corporation
* Copyright (c) 2019 Ahmad Fatoum, Pengutronix
*
* Common definitions.
* Based on SAMA5D2 datasheet:
* http://ww1.microchip.com/downloads/en/DeviceDoc/SAMA5D2-Series-Data-Sheet-DS60001476C.pdf
*
*/
#ifndef SAMA5D2_H
#define SAMA5D2_H
#include <asm/io.h>
#include <linux/sizes.h>
#include <linux/bitops.h>
#include <linux/bitfield.h>
/*
* Peripheral identifiers/interrupts. (Table 18-9)
*/
#define SAMA5D2_ID_FIQ 0 /* FIQ Interrupt ID */
/* 1 */
#define SAMA5D2_ID_ARM 2 /* Performance Monitor Unit */
#define SAMA5D2_ID_PIT 3 /* Periodic Interval Timer Interrupt */
#define SAMA5D2_ID_WDT 4 /* Watchdog Timer Interrupt */
#define SAMA5D2_ID_GMAC 5 /* Ethernet MAC */
#define SAMA5D2_ID_XDMAC0 6 /* DMA Controller 0 */
#define SAMA5D2_ID_XDMAC1 7 /* DMA Controller 1 */
#define SAMA5D2_ID_ICM 8 /* Integrity Check Monitor */
#define SAMA5D2_ID_AES 9 /* Advanced Encryption Standard */
#define SAMA5D2_ID_AESB 10 /* AES bridge */
#define SAMA5D2_ID_TDES 11 /* Triple Data Encryption Standard */
#define SAMA5D2_ID_SHA 12 /* SHA Signature */
#define SAMA5D2_ID_MPDDRC 13 /* MPDDR Controller */
#define SAMA5D2_ID_MATRIX1 14 /* H32MX, 32-bit AHB Matrix */
#define SAMA5D2_ID_MATRIX0 15 /* H64MX, 64-bit AHB Matrix */
#define SAMA5D2_ID_SECUMOD 16 /* Secure Module */
#define SAMA5D2_ID_HSMC 17 /* Multi-bit ECC interrupt */
#define SAMA5D2_ID_PIOA 18 /* Parallel I/O Controller A */
#define SAMA5D2_ID_FLEXCOM0 19 /* FLEXCOM0 */
#define SAMA5D2_ID_FLEXCOM1 20 /* FLEXCOM1 */
#define SAMA5D2_ID_FLEXCOM2 21 /* FLEXCOM2 */
#define SAMA5D2_ID_FLEXCOM3 22 /* FLEXCOM3 */
#define SAMA5D2_ID_FLEXCOM4 23 /* FLEXCOM4 */
#define SAMA5D2_ID_UART0 24 /* UART0 */
#define SAMA5D2_ID_UART1 25 /* UART1 */
#define SAMA5D2_ID_UART2 26 /* UART2 */
#define SAMA5D2_ID_UART3 27 /* UART3 */
#define SAMA5D2_ID_UART4 28 /* UART4 */
#define SAMA5D2_ID_TWI0 29 /* Two-wire Interface 0 */
#define SAMA5D2_ID_TWI1 30 /* Two-wire Interface 1 */
#define SAMA5D2_ID_SDMMC0 31 /* Secure Data Memory Card Controller 0 */
#define SAMA5D2_ID_SDMMC1 32 /* Secure Data Memory Card Controller 1 */
#define SAMA5D2_ID_SPI0 33 /* Serial Peripheral Interface 0 */
#define SAMA5D2_ID_SPI1 34 /* Serial Peripheral Interface 1 */
#define SAMA5D2_ID_TC0 35 /* Timer Counter 0 (ch.0,1,2) */
#define SAMA5D2_ID_TC1 36 /* Timer Counter 1 (ch.3,4,5) */
/* 37 */
#define SAMA5D2_ID_PWM 38 /* Pulse Width Modulation Controller0 (ch. 0,1,2,3) */
/* 39 */
#define SAMA5D2_ID_ADC 40 /* Touch Screen ADC Controller */
#define SAMA5D2_ID_UHPHS 41 /* USB Host High Speed */
#define SAMA5D2_ID_UDPHS 42 /* USB Device High Speed */
#define SAMA5D2_ID_SSC0 43 /* Serial Synchronous Controller 0 */
#define SAMA5D2_ID_SSC1 44 /* Serial Synchronous Controller 1 */
#define SAMA5D2_ID_LCDC 45 /* LCD Controller */
#define SAMA5D2_ID_ISI 46 /* Image Sensor Interface */
#define SAMA5D2_ID_TRNG 47 /* True Random Number Generator */
#define SAMA5D2_ID_PDMIC 48 /* Pulse Density Modulation Interface Controller */
#define SAMA5D2_ID_IRQ 49 /* IRQ Interrupt ID */
#define SAMA5D2_ID_SFC 50 /* Fuse Controller */
#define SAMA5D2_ID_SECURAM 51 /* Secure RAM */
#define SAMA5D2_ID_QSPI0 52 /* QSPI0 */
#define SAMA5D2_ID_QSPI1 53 /* QSPI1 */
#define SAMA5D2_ID_I2SC0 54 /* Inter-IC Sound Controller 0 */
#define SAMA5D2_ID_I2SC1 55 /* Inter-IC Sound Controller 1 */
#define SAMA5D2_ID_CAN0_INT0 56 /* MCAN 0 Interrupt0 */
#define SAMA5D2_ID_CAN1_INT0 57 /* MCAN 1 Interrupt0 */
#define SAMA5D2_ID_PTC 58 /* Peripheral Touch Controller */
#define SAMA5D2_ID_CLASSD 59 /* Audio Class D Amplifier */
#define SAMA5D2_ID_SFR 60 /* Special Function Register */
#define SAMA5D2_ID_SAIC 61 /* Secured Advanced Interrupt Controller */
#define SAMA5D2_ID_AIC 62 /* Advanced Interrupt Controller */
#define SAMA5D2_ID_L2CC 63 /* L2 Cache Controller */
#define SAMA5D2_ID_CAN0_INT1 64 /* MCAN 0 Interrupt1 */
#define SAMA5D2_ID_CAN1_INT1 65 /* MCAN 1 Interrupt1 */
#define SAMA5D2_ID_GMAC_Q1 66 /* GMAC Queue 1 Interrupt */
#define SAMA5D2_ID_GMAC_Q2 67 /* GMAC Queue 2 Interrupt */
#define SAMA5D2_ID_PIOB 68 /* Parallel I/O Controller B */
#define SAMA5D2_ID_PIOC 69 /* Parallel I/O Controller C */
#define SAMA5D2_ID_PIOD 70 /* Parallel I/O Controller D */
#define SAMA5D2_ID_SDMMC0_TIMER 71 /* Secure Data Memory Card Controller 0 */
#define SAMA5D2_ID_SDMMC1_TIMER 72 /* Secure Data Memory Card Controller 1 */
/* 73 */
#define SAMA5D2_ID_SYS 74 /* System Controller Interrupt */
#define SAMA5D2_ID_ACC 75 /* Analog Comparator */
#define SAMA5D2_ID_RXLP 76 /* UART Low-Power */
#define SAMA5D2_ID_SFRBU 77 /* Special Function Register BackUp */
#define SAMA5D2_ID_CHIPID 78 /* Chip ID */
/*
* User Peripheral physical base addresses.
*/
#define SAMA5D2_BASE_LCDC IOMEM(0xf0000000)
#define SAMA5D2_BASE_XDMAC1 IOMEM(0xf0004000)
#define SAMA5D2_BASE_HXISI IOMEM(0xf0008000)
#define SAMA5D2_BASE_MPDDRC IOMEM(0xf000c000)
#define SAMA5D2_BASE_XDMAC0 IOMEM(0xf0010000)
#define SAMA5D2_BASE_PMC IOMEM(0xf0014000)
#define SAMA5D2_BASE_MATRIX64 IOMEM(0xf0018000) /* MATRIX0 */
#define SAMA5D2_BASE_AESB IOMEM(0xf001c000)
#define SAMA5D2_BASE_QSPI0 IOMEM(0xf0020000)
#define SAMA5D2_BASE_QSPI1 IOMEM(0xf0024000)
#define SAMA5D2_BASE_SHA IOMEM(0xf0028000)
#define SAMA5D2_BASE_AES IOMEM(0xf002c000)
#define SAMA5D2_BASE_SPI0 IOMEM(0xf8000000)
#define SAMA5D2_BASE_SSC0 IOMEM(0xf8004000)
#define SAMA5D2_BASE_GMAC IOMEM(0xf8008000)
#define SAMA5D2_BASE_TC0 IOMEM(0xf800c000)
#define SAMA5D2_BASE_TC1 IOMEM(0xf8010000)
#define SAMA5D2_BASE_HSMC IOMEM(0xf8014000)
#define SAMA5D2_BASE_PDMIC IOMEM(0xf8018000)
#define SAMA5D2_BASE_UART0 IOMEM(0xf801c000)
#define SAMA5D2_BASE_UART1 IOMEM(0xf8020000)
#define SAMA5D2_BASE_UART2 IOMEM(0xf8024000)
#define SAMA5D2_BASE_TWI0 IOMEM(0xf8028000)
#define SAMA5D2_BASE_PWMC IOMEM(0xf802c000)
#define SAMA5D2_BASE_SFR IOMEM(0xf8030000)
#define SAMA5D2_BASE_FLEXCOM0 IOMEM(0xf8034000)
#define SAMA5D2_BASE_FLEXCOM1 IOMEM(0xf8038000)
#define SAMA5D2_BASE_SAIC IOMEM(0xf803c000)
#define SAMA5D2_BASE_ICM IOMEM(0xf8040000)
#define SAMA5D2_BASE_SECURAM IOMEM(0xf8044000)
#define SAMA5D2_BASE_SYSC IOMEM(0xf8048000)
#define SAMA5D2_BASE_ACC IOMEM(0xf804a000)
#define SAMA5D2_BASE_SFC IOMEM(0xf804c000)
#define SAMA5D2_BASE_I2SC0 IOMEM(0xf8050000)
#define SAMA5D2_BASE_CAN0 IOMEM(0xf8054000)
#define SAMA5D2_BASE_SPI1 IOMEM(0xfc000000)
#define SAMA5D2_BASE_SSC1 IOMEM(0xfc004000)
#define SAMA5D2_BASE_UART3 IOMEM(0xfc008000)
#define SAMA5D2_BASE_UART4 IOMEM(0xfc00c000)
#define SAMA5D2_BASE_FLEXCOM2 IOMEM(0xfc010000)
#define SAMA5D2_BASE_FLEXCOM3 IOMEM(0xfc014000)
#define SAMA5D2_BASE_FLEXCOM4 IOMEM(0xfc018000)
#define SAMA5D2_BASE_TRNG IOMEM(0xfc01c000)
#define SAMA5D2_BASE_AIC IOMEM(0xfc020000)
#define SAMA5D2_BASE_TWI1 IOMEM(0xfc028000)
#define SAMA5D2_BASE_UDPHS IOMEM(0xfc02c000)
#define SAMA5D2_BASE_ADC IOMEM(0xfc030000)
#define SAMA5D2_BASE_PIOA IOMEM(0xfc038000)
#define SAMA5D2_BASE_MATRIX32 IOMEM(0xfc03c000) /* MATRIX1 */
#define SAMA5D2_BASE_SECUMOD IOMEM(0xfc040000)
#define SAMA5D2_BASE_TDES IOMEM(0xfc044000)
#define SAMA5D2_BASE_CLASSD IOMEM(0xfc048000)
#define SAMA5D2_BASE_I2SC1 IOMEM(0xfc04c000)
#define SAMA5D2_BASE_CAN1 IOMEM(0xfc050000)
#define SAMA5D2_BASE_SFRBU IOMEM(0xfc05c000)
#define SAMA5D2_BASE_CHIPID IOMEM(0xfc069000)
/*
* Address Memory Space
*/
#define SAMA5D2_BASE_INTERNAL_MEM IOMEM(0x00000000)
#define SAMA5D2_BASE_CS0 IOMEM(0x10000000)
#define SAMA5D2_BASE_DDRCS IOMEM(0x20000000)
#define SAMA5D2_BASE_DDRCS_AES IOMEM(0x40000000)
#define SAMA5D2_BASE_CS1 IOMEM(0x60000000)
#define SAMA5D2_BASE_CS2 IOMEM(0x70000000)
#define SAMA5D2_BASE_CS3 IOMEM(0x80000000)
#define SAMA5D2_BASE_QSPI0_AES_MEM IOMEM(0x90000000)
#define SAMA5D2_BASE_QSPI1_AES_MEM IOMEM(0x98000000)
#define SAMA5D2_BASE_SDHC0 IOMEM(0xa0000000)
#define SAMA5D2_BASE_SDHC1 IOMEM(0xb0000000)
#define SAMA5D2_BASE_NFC_CMD_REG IOMEM(0xc0000000)
#define SAMA5D2_BASE_QSPI0_MEM IOMEM(0xd0000000)
#define SAMA5D2_BASE_QSPI1_MEM IOMEM(0xd8000000)
#define SAMA5D2_BASE_PERIPH IOMEM(0xf0000000)
/*
* Internal Memories
*/
#define SAMA5D2_BASE_ROM IOMEM(0x00000000) /* ROM */
#define SAMA5D2_BASE_ECC_ROM IOMEM(0x00060000) /* ECC ROM */
#define SAMA5D2_BASE_NFC_SRAM 0x00100000 /* NFC SRAM */
#define SAMA5D2_BASE_SRAM0 0x00200000 /* SRAM0 */
#define SAMA5D2_BASE_SRAM1 0x00220000 /* SRAM1 */
#define SAMA5D2_BASE_UDPHS_SRAM 0x00300000 /* UDPHS RAM */
#define SAMA5D2_BASE_UHP_OHCI IOMEM(0x00400000) /* UHP OHCI */
#define SAMA5D2_BASE_UHP_EHCI IOMEM(0x00500000) /* UHP EHCI */
#define SAMA5D2_BASE_AXI_MATRIX IOMEM(0x00600000) /* AXI Maxtrix */
#define SAMA5D2_BASE_DAP IOMEM(0x00700000) /* DAP */
#define SAMA5D2_BASE_PTC IOMEM(0x00800000) /* PTC */
#define SAMA5D2_BASE_L2CC IOMEM(0x00A00000) /* L2CC */
/*
* Other misc defines
*/
#define SAMA5D2_BASE_PMECC (SAMA5D2_BASE_HSMC + 0x70)
#define SAMA5D2_BASE_PMERRLOC (SAMA5D2_BASE_HSMC + 0x500)
#define SAMA5D2_PMECC (SAMA5D2_BASE_PMECC - SAMA5D2_BASE_SYS)
#define SAMA5D2_PMERRLOC (SAMA5D2_BASE_PMERRLOC - SAMA5D2_BASE_SYS)
#define SAMA5D2_BASE_PIOB (SAMA5D2_BASE_PIOA + 0x40)
#define SAMA5D2_BASE_PIOC (SAMA5D2_BASE_PIOB + 0x40)
#define SAMA5D2_BASE_PIOD (SAMA5D2_BASE_PIOC + 0x40)
/* SYSC spawns */
#define SAMA5D2_BASE_RSTC SAMA5D2_BASE_SYSC
#define SAMA5D2_BASE_SHDC (SAMA5D2_BASE_SYSC + 0x10)
#define SAMA5D2_BASE_PITC (SAMA5D2_BASE_SYSC + 0x30)
#define SAMA5D2_BASE_WDT (SAMA5D2_BASE_SYSC + 0x40)
#define SAMA5D2_BASE_SCKCR (SAMA5D2_BASE_SYSC + 0x50)
#define SAMA5D2_BASE_RTCC (SAMA5D2_BASE_SYSC + 0xb0)
#define SAMA5D2_BASE_SMC (SAMA5D2_BASE_HSMC + 0x700)
#define SAMA5D2_NUM_PIO 4
#define SAMA5D2_NUM_TWI 2
/* AICREDIR Unlock Key */
#define SAMA5D2_AICREDIR_KEY 0xB6D81C4D
/*
* Matrix Slaves ID
*/
/* MATRIX0(H64MX) Matrix Slaves */
/* Bridge from H64MX to AXIMX (Internal ROM, Cryto Library, PKCC RAM) */
#define SAMA5D2_H64MX_SLAVE_BRIDGE_TO_AXIMX 0
#define SAMA5D2_H64MX_SLAVE_PERI_BRIDGE 1 /* H64MX Peripheral Bridge */
#define SAMA5D2_H64MX_SLAVE_DDR2_PORT_0 2 /* DDR2 Port0-AESOTF */
#define SAMA5D2_H64MX_SLAVE_DDR2_PORT_1 3 /* DDR2 Port1 */
#define SAMA5D2_H64MX_SLAVE_DDR2_PORT_2 4 /* DDR2 Port2 */
#define SAMA5D2_H64MX_SLAVE_DDR2_PORT_3 5 /* DDR2 Port3 */
#define SAMA5D2_H64MX_SLAVE_DDR2_PORT_4 6 /* DDR2 Port4 */
#define SAMA5D2_H64MX_SLAVE_DDR2_PORT_5 7 /* DDR2 Port5 */
#define SAMA5D2_H64MX_SLAVE_DDR2_PORT_6 8 /* DDR2 Port6 */
#define SAMA5D2_H64MX_SLAVE_DDR2_PORT_7 9 /* DDR2 Port7 */
#define SAMA5D2_H64MX_SLAVE_INTERNAL_SRAM 10 /* Internal SRAM 128K */
#define SAMA5D2_H64MX_SLAVE_CACHE_L2 11 /* Internal SRAM 128K (Cache L2) */
#define SAMA5D2_H64MX_SLAVE_QSPI0 12 /* QSPI0 */
#define SAMA5D2_H64MX_SLAVE_QSPI1 13 /* QSPI1 */
#define SAMA5D2_H64MX_SLAVE_AESB 14 /* AESB */
/* MATRIX1(H32MX) Matrix Slaves */
#define SAMA5D2_H32MX_BRIDGE_TO_H64MX 0 /* Bridge from H32MX to H64MX */
#define SAMA5D2_H32MX_PERI_BRIDGE_0 1 /* H32MX Peripheral Bridge 0 */
#define SAMA5D2_H32MX_PERI_BRIDGE_1 2 /* H32MX Peripheral Bridge 1 */
#define SAMA5D2_H32MX_EXTERNAL_EBI 3 /* External Bus Interface */
#define SAMA5D2_H32MX_NFC_CMD_REG 3 /* NFC command Register */
#define SAMA5D2_H32MX_NFC_SRAM 4 /* NFC SRAM */
#define SAMA5D2_H32MX_USB 5
#define SAMA5D2_SRAM_BASE SAMA5D2_BASE_SRAM0
#define SAMA5D2_SRAM_SIZE (128 * SZ_1K)
static inline void __iomem *sama5d2_pio_map_bank(int bank, unsigned *id)
{
switch(bank + 'A') {
case 'A':
*id = SAMA5D2_ID_PIOA;
return SAMA5D2_BASE_PIOA;
case 'B':
*id = SAMA5D2_ID_PIOB;
return SAMA5D2_BASE_PIOB;
case 'C':
*id = SAMA5D2_ID_PIOC;
return SAMA5D2_BASE_PIOC;
case 'D':
*id = SAMA5D2_ID_PIOD;
return SAMA5D2_BASE_PIOD;
}
return NULL;
}
#define SAMA5D2_BUREG_INDEX GENMASK(1, 0)
#define SAMA5D2_BUREG_VALID BIT(2)
#define SAMA5D2_SFC_DR(x) (SAMA5D2_BASE_SFC + 0x20 + 4 * (x))
#define SAMA5D2_BOOTCFG_QSPI_0 GENMASK(1, 0)
#define SAMA5D2_BOOTCFG_QSPI_1 GENMASK(3, 2)
#define SAMA5D2_BOOTCFG_SPI_0 GENMASK(5, 4)
#define SAMA5D2_BOOTCFG_SPI_1 GENMASK(7, 6)
#define SAMA5D2_BOOTCFG_NFC GENMASK(9, 8)
#define SAMA5D2_BOOTCFG_SDMMC_0 BIT(10)
#define SAMA5D2_BOOTCFG_SDMMC_1 BIT(11)
#define SAMA5D2_BOOTCFG_UART GENMASK(15, 12)
#define SAMA5D2_BOOTCFG_JTAG GENMASK(17, 16)
#define SAMA5D2_BOOTCFG_EXT_MEM_BOOT_EN BIT(18)
#define SAMA5D2_BOOTCFG_QSPI_XIP BIT(21)
#define SAMA5D2_DISABLE_BSC_CR BIT(22)
#define SAMA5D2_DISABLE_MONITOR BIT(24)
#define SAMA5D2_SECURE_MODE BIT(29)
static inline u32 sama5d2_bootcfg(void)
{
u32 __iomem *bureg = SAMA5D2_BASE_SECURAM + 0x1400;
u32 bsc_cr = readl(SAMA5D2_BASE_SYSC + 0x54);
u32 __iomem *bootcfg;
if (bsc_cr & SAMA5D2_BUREG_VALID)
bootcfg = &bureg[FIELD_GET(SAMA5D2_BUREG_INDEX, bsc_cr)];
else
bootcfg = SAMA5D2_SFC_DR(512 / 32);
return readl(bootcfg);
}
#endif
|