xref: /optee_os/core/arch/arm/plat-sam/scmi_server.c (revision 3006d24de21210d5be12c446bb4ff9517e3034e4)
13ae16402SClément Léger // SPDX-License-Identifier: BSD-2-Clause
23ae16402SClément Léger /*
33ae16402SClément Léger  * Copyright (c) 2019, STMicroelectronics
43ae16402SClément Léger  * Copyright (c) 2021, Microchip
53ae16402SClément Léger  */
63ae16402SClément Léger 
72277c3f7SClément Léger #include <at91_clk.h>
83ae16402SClément Léger #include <confine_array_index.h>
93f788a22STony Han #include <drivers/atmel_rstc.h>
103f788a22STony Han #include <drivers/rstctrl.h>
113ae16402SClément Léger #include <drivers/scmi-msg.h>
123ae16402SClément Léger #include <drivers/scmi.h>
132277c3f7SClément Léger #include <dt-bindings/clock/at91.h>
143ae16402SClément Léger #include <initcall.h>
153ae16402SClément Léger #include <tee_api_defines.h>
163ae16402SClément Léger 
173ae16402SClément Léger static_assert(SMT_BUF_SLOT_SIZE <= CFG_SCMI_SHMEM_SIZE);
183ae16402SClément Léger 
193ae16402SClément Léger register_phys_mem(MEM_AREA_IO_NSEC, CFG_SCMI_SHMEM_START, CFG_SCMI_SHMEM_SIZE);
203ae16402SClément Léger 
213f788a22STony Han #define RESET_CELL(_scmi_id, _id, _name) \
223f788a22STony Han 	[(_scmi_id)] = { \
233f788a22STony Han 		.reset_id = (_id), \
243f788a22STony Han 		.name = (_name), \
253f788a22STony Han 	}
263f788a22STony Han 
273f788a22STony Han #define RST_SCMI_USB1 0
283f788a22STony Han #define RST_SCMI_USB2 1
293f788a22STony Han #define RST_SCMI_USB3 2
303f788a22STony Han 
313f788a22STony Han struct sam_scmi_rd {
323f788a22STony Han 	unsigned int reset_id;
333f788a22STony Han 	const char *name;
343f788a22STony Han 	struct rstctrl *rstctrl;
353f788a22STony Han };
363f788a22STony Han 
373f788a22STony Han static struct sam_scmi_rd sam_scmi_reset_domain[] = {
383f788a22STony Han #ifdef CFG_SAMA7G5
393f788a22STony Han 	RESET_CELL(RST_SCMI_USB1, SHIFT_U32(0xE4, RESET_ID_SHIFT) | 4, "USB1"),
403f788a22STony Han 	RESET_CELL(RST_SCMI_USB2, SHIFT_U32(0xE4, RESET_ID_SHIFT) | 5, "USB2"),
413f788a22STony Han 	RESET_CELL(RST_SCMI_USB3, SHIFT_U32(0xE4, RESET_ID_SHIFT) | 6, "USB3"),
423f788a22STony Han #endif
433f788a22STony Han };
443f788a22STony Han 
453ae16402SClément Léger struct channel_resources {
463ae16402SClément Léger 	struct scmi_msg_channel *channel;
473f788a22STony Han 	struct sam_scmi_rd *rd;
483f788a22STony Han 	size_t rd_count;
493ae16402SClément Léger };
503ae16402SClément Léger 
513ae16402SClément Léger static const struct channel_resources scmi_channel[] = {
523ae16402SClément Léger 	[0] = {
533ae16402SClément Léger 		.channel = &(struct scmi_msg_channel){
543ae16402SClément Léger 			.shm_addr = { .pa = CFG_SCMI_SHMEM_START },
553ae16402SClément Léger 			.shm_size = SMT_BUF_SLOT_SIZE,
563ae16402SClément Léger 		},
573f788a22STony Han 		.rd = sam_scmi_reset_domain,
583f788a22STony Han 		.rd_count = ARRAY_SIZE(sam_scmi_reset_domain),
593ae16402SClément Léger 	},
603ae16402SClément Léger };
613ae16402SClément Léger 
find_resource(unsigned int channel_id)623ae16402SClément Léger static const struct channel_resources *find_resource(unsigned int channel_id)
633ae16402SClément Léger {
643ae16402SClément Léger 	assert(channel_id < ARRAY_SIZE(scmi_channel));
653ae16402SClément Léger 
663ae16402SClément Léger 	return scmi_channel + channel_id;
673ae16402SClément Léger }
683ae16402SClément Léger 
plat_scmi_get_channel(unsigned int channel_id)693ae16402SClément Léger struct scmi_msg_channel *plat_scmi_get_channel(unsigned int channel_id)
703ae16402SClément Léger {
713ae16402SClément Léger 	const size_t max_id = ARRAY_SIZE(scmi_channel);
723ae16402SClément Léger 	unsigned int confined_id = confine_array_index(channel_id, max_id);
733ae16402SClément Léger 
743ae16402SClément Léger 	if (channel_id >= max_id)
753ae16402SClément Léger 		return NULL;
763ae16402SClément Léger 
773ae16402SClément Léger 	return find_resource(confined_id)->channel;
783ae16402SClément Léger }
793ae16402SClément Léger 
803ae16402SClément Léger static const char vendor[] = "Microchip";
813ae16402SClément Léger static const char sub_vendor[] = "";
823ae16402SClément Léger 
plat_scmi_vendor_name(void)833ae16402SClément Léger const char *plat_scmi_vendor_name(void)
843ae16402SClément Léger {
853ae16402SClément Léger 	return vendor;
863ae16402SClément Léger }
873ae16402SClément Léger 
plat_scmi_sub_vendor_name(void)883ae16402SClément Léger const char *plat_scmi_sub_vendor_name(void)
893ae16402SClément Léger {
903ae16402SClément Léger 	return sub_vendor;
913ae16402SClément Léger }
923ae16402SClément Léger 
933ae16402SClément Léger /* Currently supporting only SCMI Base protocol */
943ae16402SClément Léger static const uint8_t plat_protocol_list[] = {
953ae16402SClément Léger 	SCMI_PROTOCOL_ID_CLOCK,
963f788a22STony Han 	SCMI_PROTOCOL_ID_RESET_DOMAIN,
973ae16402SClément Léger 	0 /* Null termination */
983ae16402SClément Léger };
993ae16402SClément Léger 
plat_scmi_protocol_count(void)1003ae16402SClément Léger size_t plat_scmi_protocol_count(void)
1013ae16402SClément Léger {
1023ae16402SClément Léger 	return ARRAY_SIZE(plat_protocol_list) - 1;
1033ae16402SClément Léger }
1043ae16402SClément Léger 
plat_scmi_protocol_list(unsigned int channel_id __unused)1053ae16402SClément Léger const uint8_t *plat_scmi_protocol_list(unsigned int channel_id __unused)
1063ae16402SClément Léger {
1073ae16402SClément Léger 	return plat_protocol_list;
1083ae16402SClément Léger }
1093ae16402SClément Léger 
110609ba8e3STony Han struct sam_pmc_clk {
1112277c3f7SClément Léger 	unsigned int scmi_id;
1122277c3f7SClément Léger 	unsigned int pmc_type;
1132277c3f7SClément Léger 	unsigned int pmc_id;
114f90d78a6STony Han 	struct clk_range output_range;
1152277c3f7SClément Léger };
1162277c3f7SClément Léger 
117609ba8e3STony Han #ifdef CFG_SAMA7G5
118f90d78a6STony Han static struct sam_pmc_clk pmc_clks[] = {
119609ba8e3STony Han 	{
120609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_CORE_MCK,
121609ba8e3STony Han 		.pmc_type = PMC_TYPE_CORE,
122609ba8e3STony Han 		.pmc_id = PMC_MCK
123609ba8e3STony Han 	},
124609ba8e3STony Han 	{
125609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_CORE_UTMI,
126609ba8e3STony Han 		.pmc_type = PMC_TYPE_CORE,
127609ba8e3STony Han 		.pmc_id = PMC_UTMI
128609ba8e3STony Han 	},
129609ba8e3STony Han 	{
130609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_CORE_CPUPLLCK,
131609ba8e3STony Han 		.pmc_type = PMC_TYPE_CORE,
132609ba8e3STony Han 		.pmc_id = PMC_CPUPLL
133609ba8e3STony Han 	},
134609ba8e3STony Han 	{
135609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_CORE_MAIN,
136609ba8e3STony Han 		.pmc_type = PMC_TYPE_CORE,
137609ba8e3STony Han 		.pmc_id = PMC_MAIN
138609ba8e3STony Han 	},
139609ba8e3STony Han 	{
140609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_CORE_SYSPLLCK,
141609ba8e3STony Han 		.pmc_type = PMC_TYPE_CORE,
142609ba8e3STony Han 		.pmc_id = PMC_SYSPLL
143609ba8e3STony Han 	},
144609ba8e3STony Han 
145609ba8e3STony Han 	{
146609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_CORE_AUDIOPLLCK,
147609ba8e3STony Han 		.pmc_type = PMC_TYPE_CORE,
148609ba8e3STony Han 		.pmc_id = PMC_AUDIOPMCPLL
149609ba8e3STony Han 	},
150609ba8e3STony Han 
151609ba8e3STony Han 	{
152609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_CORE_MCK_PRES,
153609ba8e3STony Han 		.pmc_type = PMC_TYPE_CORE,
154609ba8e3STony Han 		.pmc_id = PMC_MCK_PRES
155609ba8e3STony Han 	},
156609ba8e3STony Han 	{
157609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_CORE_DDRPLLCK,
158609ba8e3STony Han 		.pmc_type = PMC_TYPE_CORE,
159609ba8e3STony Han 		.pmc_id = PMC_DDRPLL
160609ba8e3STony Han 	},
161609ba8e3STony Han 	{
162609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_CORE_IMGPLLCK,
163609ba8e3STony Han 		.pmc_type = PMC_TYPE_CORE,
164609ba8e3STony Han 		.pmc_id = PMC_IMGPLL
165609ba8e3STony Han 	},
166609ba8e3STony Han 	{
167609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_CORE_ETHPLLCK,
168609ba8e3STony Han 		.pmc_type = PMC_TYPE_CORE,
169609ba8e3STony Han 		.pmc_id = PMC_ETHPLL
170609ba8e3STony Han 	},
171609ba8e3STony Han 	{
172609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_UTMI1,
173609ba8e3STony Han 		.pmc_type = PMC_TYPE_CORE,
174609ba8e3STony Han 		.pmc_id = PMC_UTMI1
175609ba8e3STony Han 	},
176609ba8e3STony Han 	{
177609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_UTMI2,
178609ba8e3STony Han 		.pmc_type = PMC_TYPE_CORE,
179609ba8e3STony Han 		.pmc_id = PMC_UTMI2
180609ba8e3STony Han 	},
181609ba8e3STony Han 	{
182609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_UTMI3,
183609ba8e3STony Han 		.pmc_type = PMC_TYPE_CORE,
184609ba8e3STony Han 		.pmc_id = PMC_UTMI3
185609ba8e3STony Han 	},
186609ba8e3STony Han 	{
187609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_SYSTEM_PCK0,
188609ba8e3STony Han 		.pmc_type = PMC_TYPE_SYSTEM,
189609ba8e3STony Han 		.pmc_id = 8
190609ba8e3STony Han 	},
191609ba8e3STony Han 	{
192609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_SYSTEM_PCK1,
193609ba8e3STony Han 		.pmc_type = PMC_TYPE_SYSTEM,
194609ba8e3STony Han 		.pmc_id = 9
195609ba8e3STony Han 	},
196609ba8e3STony Han 	{
197609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_SYSTEM_PCK2,
198609ba8e3STony Han 		.pmc_type = PMC_TYPE_SYSTEM,
199609ba8e3STony Han 		.pmc_id = 10
200609ba8e3STony Han 	},
201609ba8e3STony Han 	{
202609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_SYSTEM_PCK3,
203609ba8e3STony Han 		.pmc_type = PMC_TYPE_SYSTEM,
204609ba8e3STony Han 		.pmc_id = 11
205609ba8e3STony Han 	},
206609ba8e3STony Han 	{
207609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_SYSTEM_PCK4,
208609ba8e3STony Han 		.pmc_type = PMC_TYPE_SYSTEM,
209609ba8e3STony Han 		.pmc_id = 12
210609ba8e3STony Han 	},
211609ba8e3STony Han 	{
212609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_SYSTEM_PCK5,
213609ba8e3STony Han 		.pmc_type = PMC_TYPE_SYSTEM,
214609ba8e3STony Han 		.pmc_id = 13
215609ba8e3STony Han 	},
216609ba8e3STony Han 	{
217609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_SYSTEM_PCK6,
218609ba8e3STony Han 		.pmc_type = PMC_TYPE_SYSTEM,
219609ba8e3STony Han 		.pmc_id = 14
220609ba8e3STony Han 	},
221609ba8e3STony Han 	{
222609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_SYSTEM_PCK7,
223609ba8e3STony Han 		.pmc_type = PMC_TYPE_SYSTEM,
224609ba8e3STony Han 		.pmc_id = 15
225609ba8e3STony Han 	},
226609ba8e3STony Han 	{
227eb3951bfSThomas Perrot 		.scmi_id = AT91_SCMI_CLK_PERIPH_ASRC_CLK,
228eb3951bfSThomas Perrot 		.pmc_type = PMC_TYPE_PERIPHERAL,
229eb3951bfSThomas Perrot 		.pmc_id = ID_ASRC
230eb3951bfSThomas Perrot 	},
231eb3951bfSThomas Perrot 	{
232eb3951bfSThomas Perrot 		.scmi_id = AT91_SCMI_CLK_GCK_ASRC_GCLK,
233eb3951bfSThomas Perrot 		.pmc_type = PMC_TYPE_GCK,
234eb3951bfSThomas Perrot 		.pmc_id = ID_ASRC
235eb3951bfSThomas Perrot 	},
236eb3951bfSThomas Perrot 	{
237eb3951bfSThomas Perrot 		.scmi_id = AT91_SCMI_CLK_PERIPH_CSI_CLK,
238eb3951bfSThomas Perrot 		.pmc_type = PMC_TYPE_PERIPHERAL,
239eb3951bfSThomas Perrot 		.pmc_id = ID_CSI
240eb3951bfSThomas Perrot 	},
241eb3951bfSThomas Perrot 	{
242eb3951bfSThomas Perrot 		.scmi_id = AT91_SCMI_CLK_GCK_CSI_GCLK,
243eb3951bfSThomas Perrot 		.pmc_type = PMC_TYPE_GCK,
244eb3951bfSThomas Perrot 		.pmc_id = ID_CSI
245eb3951bfSThomas Perrot 	},
246eb3951bfSThomas Perrot 	{
247eb3951bfSThomas Perrot 		.scmi_id = AT91_SCMI_CLK_PERIPH_CSI2DC_CLK,
248eb3951bfSThomas Perrot 		.pmc_type = PMC_TYPE_PERIPHERAL,
249eb3951bfSThomas Perrot 		.pmc_id = ID_CSI2DC
250eb3951bfSThomas Perrot 	},
251eb3951bfSThomas Perrot 	{
252609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_MACB0_CLK,
253609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
254609ba8e3STony Han 		.pmc_id = ID_GMAC0
255609ba8e3STony Han 	},
256609ba8e3STony Han 	{
257609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_MACB0_GCLK,
258609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
259609ba8e3STony Han 		.pmc_id = ID_GMAC0
260609ba8e3STony Han 	},
261609ba8e3STony Han 	{
262609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_MACB0_TSU,
263609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
264609ba8e3STony Han 		.pmc_id = ID_GMAC0_TSU
265609ba8e3STony Han 	},
266609ba8e3STony Han 	{
267eb3951bfSThomas Perrot 		.scmi_id = AT91_SCMI_CLK_PERIPH_MACB1_CLK,
268eb3951bfSThomas Perrot 		.pmc_type = PMC_TYPE_PERIPHERAL,
269eb3951bfSThomas Perrot 		.pmc_id = ID_GMAC1
270eb3951bfSThomas Perrot 	},
271eb3951bfSThomas Perrot 	{
272eb3951bfSThomas Perrot 		.scmi_id = AT91_SCMI_CLK_GCK_MACB1_GCLK,
273eb3951bfSThomas Perrot 		.pmc_type = PMC_TYPE_GCK,
274eb3951bfSThomas Perrot 		.pmc_id = ID_GMAC1
275eb3951bfSThomas Perrot 	},
276eb3951bfSThomas Perrot 	{
277eb3951bfSThomas Perrot 		.scmi_id = AT91_SCMI_CLK_GCK_MACB1_TSU,
278eb3951bfSThomas Perrot 		.pmc_type = PMC_TYPE_GCK,
279eb3951bfSThomas Perrot 		.pmc_id = ID_GMAC1_TSU
280eb3951bfSThomas Perrot 	},
281eb3951bfSThomas Perrot 	{
282609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_TDES_CLK,
283609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
284609ba8e3STony Han 		.pmc_id = ID_TDES
285609ba8e3STony Han 	},
286609ba8e3STony Han 	{
287609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_HSMC_CLK,
288609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
289609ba8e3STony Han 		.pmc_id = ID_HSMC
290609ba8e3STony Han 	},
291609ba8e3STony Han 	{
292609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_PIOA_CLK,
293609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
294609ba8e3STony Han 		.pmc_id = ID_PIOA
295609ba8e3STony Han 	},
296609ba8e3STony Han 	{
297609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX0_CLK,
298609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
299609ba8e3STony Han 		.pmc_id = ID_FLEXCOM0
300609ba8e3STony Han 	},
301609ba8e3STony Han 	{
302609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX1_CLK,
303609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
304609ba8e3STony Han 		.pmc_id = ID_FLEXCOM1
305609ba8e3STony Han 	},
306609ba8e3STony Han 	{
307609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX2_CLK,
308609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
309609ba8e3STony Han 		.pmc_id = ID_FLEXCOM2
310609ba8e3STony Han 	},
311609ba8e3STony Han 	{
312609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX3_CLK,
313609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
314609ba8e3STony Han 		.pmc_id = ID_FLEXCOM3
315609ba8e3STony Han 	},
316609ba8e3STony Han 	{
317609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX4_CLK,
318609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
319609ba8e3STony Han 		.pmc_id = ID_FLEXCOM4
320609ba8e3STony Han 	},
321609ba8e3STony Han 	{
322609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX5_CLK,
323609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
324609ba8e3STony Han 		.pmc_id = ID_FLEXCOM5
325609ba8e3STony Han 	},
326609ba8e3STony Han 	{
327609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX6_CLK,
328609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
329609ba8e3STony Han 		.pmc_id = ID_FLEXCOM6
330609ba8e3STony Han 	},
331609ba8e3STony Han 	{
332609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX7_CLK,
333609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
334609ba8e3STony Han 		.pmc_id = ID_FLEXCOM7
335609ba8e3STony Han 	},
336609ba8e3STony Han 	{
337609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX8_CLK,
338609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
339609ba8e3STony Han 		.pmc_id = ID_FLEXCOM8
340609ba8e3STony Han 	},
341609ba8e3STony Han 	{
342609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX9_CLK,
343609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
344609ba8e3STony Han 		.pmc_id = ID_FLEXCOM9
345609ba8e3STony Han 	},
346609ba8e3STony Han 	{
347609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX10_CLK,
348609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
349609ba8e3STony Han 		.pmc_id = ID_FLEXCOM10
350609ba8e3STony Han 	},
351609ba8e3STony Han 	{
352609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX11_CLK,
353609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
354609ba8e3STony Han 		.pmc_id = ID_FLEXCOM11
355609ba8e3STony Han 	},
356609ba8e3STony Han 	{
357609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_TCB0_CLK,
358609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
359609ba8e3STony Han 		.pmc_id = ID_TC0_CHANNEL0
360609ba8e3STony Han 	},
361609ba8e3STony Han 	{
362609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_TCB1_CLK,
363609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
364609ba8e3STony Han 		.pmc_id = ID_TC1_CHANNEL0
365609ba8e3STony Han 	},
366609ba8e3STony Han 	{
367609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_PWM_CLK,
368609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
369609ba8e3STony Han 		.pmc_id = ID_PWM
370609ba8e3STony Han 	},
371609ba8e3STony Han 	{
372609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_ADC_GCLK,
373609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
374609ba8e3STony Han 		.pmc_id = ID_ADC
375609ba8e3STony Han 	},
376609ba8e3STony Han 	{
377609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_UHPHS_CLK,
378609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
379609ba8e3STony Han 		.pmc_id = ID_UHPHS
380609ba8e3STony Han 	},
381609ba8e3STony Han 	{
382609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_UDPHSA_CLK,
383609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
384609ba8e3STony Han 		.pmc_id = ID_UDPHSA
385609ba8e3STony Han 	},
386609ba8e3STony Han 	{
387609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_UDPHSB_CLK,
388609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
389609ba8e3STony Han 		.pmc_id = ID_UDPHSB
390609ba8e3STony Han 	},
391609ba8e3STony Han 	{
392609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_SSC0_CLK,
393609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
394609ba8e3STony Han 		.pmc_id = ID_SSC0
395609ba8e3STony Han 	},
396609ba8e3STony Han 	{
397609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_SSC1_CLK,
398609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
399609ba8e3STony Han 		.pmc_id = ID_SSC1
400609ba8e3STony Han 	},
401609ba8e3STony Han 	{
402609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_TRNG_CLK,
403609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
404609ba8e3STony Han 		.pmc_id = ID_TRNG
405609ba8e3STony Han 	},
406609ba8e3STony Han 	{
407609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_PDMC0_CLK,
408609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
409609ba8e3STony Han 		.pmc_id = ID_PDMC0
410609ba8e3STony Han 	},
411609ba8e3STony Han 	{
412609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_PDMC1_CLK,
413609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
414609ba8e3STony Han 		.pmc_id = ID_PDMC1
415609ba8e3STony Han 	},
416609ba8e3STony Han 	{
417*3006d24dSTony Han 		.scmi_id = AT91_SCMI_CLK_GCK_PDMC0_GCLK,
418*3006d24dSTony Han 		.pmc_type = PMC_TYPE_GCK,
419*3006d24dSTony Han 		.pmc_id = ID_PDMC0
420*3006d24dSTony Han 	},
421*3006d24dSTony Han 	{
422*3006d24dSTony Han 		.scmi_id = AT91_SCMI_CLK_GCK_PDMC1_GCLK,
423*3006d24dSTony Han 		.pmc_type = PMC_TYPE_GCK,
424*3006d24dSTony Han 		.pmc_id = ID_PDMC1
425*3006d24dSTony Han 	},
426*3006d24dSTony Han 	{
427609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_SECURAM_CLK,
428609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
429609ba8e3STony Han 		.pmc_id = ID_SECURAM
430609ba8e3STony Han 	},
431609ba8e3STony Han 	{
432609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_I2S0_CLK,
433609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
434609ba8e3STony Han 		.pmc_id = ID_I2SMCC0
435609ba8e3STony Han 	},
436609ba8e3STony Han 	{
437609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_I2S1_CLK,
438609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
439609ba8e3STony Han 		.pmc_id = ID_I2SMCC1
440609ba8e3STony Han 	},
441609ba8e3STony Han 	{
442609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_CAN0_CLK,
443609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
444609ba8e3STony Han 		.pmc_id = ID_MCAN0
445609ba8e3STony Han 	},
446609ba8e3STony Han 	{
447609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_CAN1_CLK,
448609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
449609ba8e3STony Han 		.pmc_id = ID_MCAN1
450609ba8e3STony Han 	},
451609ba8e3STony Han 	{
452609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_CAN2_CLK,
453609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
454609ba8e3STony Han 		.pmc_id = ID_MCAN2
455609ba8e3STony Han 	},
456609ba8e3STony Han 	{
457609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_CAN3_CLK,
458609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
459609ba8e3STony Han 		.pmc_id = ID_MCAN3
460609ba8e3STony Han 	},
461609ba8e3STony Han 	{
462609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_CAN4_CLK,
463609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
464609ba8e3STony Han 		.pmc_id = ID_MCAN4
465609ba8e3STony Han 	},
466609ba8e3STony Han 	{
467609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_CAN5_CLK,
468609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
469609ba8e3STony Han 		.pmc_id = ID_MCAN5
470609ba8e3STony Han 	},
471609ba8e3STony Han 	{
472609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_DMA0_CLK,
473609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
474609ba8e3STony Han 		.pmc_id = ID_XDMAC0
475609ba8e3STony Han 	},
476609ba8e3STony Han 	{
477609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_DMA1_CLK,
478609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
479609ba8e3STony Han 		.pmc_id = ID_XDMAC1
480609ba8e3STony Han 	},
481609ba8e3STony Han 	{
482609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_DMA2_CLK,
483609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
484609ba8e3STony Han 		.pmc_id = ID_XDMAC2
485609ba8e3STony Han 	},
486609ba8e3STony Han 	{
487609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_SPDIFRX_CLK,
488609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
489609ba8e3STony Han 		.pmc_id = ID_SPDIFRX
490609ba8e3STony Han 	},
491609ba8e3STony Han 	{
492609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_SPDIFTX_CLK,
493609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
494609ba8e3STony Han 		.pmc_id = ID_SPDIFTX
495609ba8e3STony Han 	},
496609ba8e3STony Han 	{
497609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_SPDIFRX_GCLK,
498609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
499609ba8e3STony Han 		.pmc_id = ID_SPDIFRX
500609ba8e3STony Han 	},
501609ba8e3STony Han 	{
502609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_SPDIFTX_GCLK,
503609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
504609ba8e3STony Han 		.pmc_id = ID_SPDIFTX
505609ba8e3STony Han 	},
506609ba8e3STony Han 	{
507609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_AES_CLK,
508609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
509609ba8e3STony Han 		.pmc_id = ID_AES
510609ba8e3STony Han 	},
511609ba8e3STony Han 	{
512609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_AESB_CLK,
513609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
514609ba8e3STony Han 		.pmc_id = ID_TZAESBASC
515609ba8e3STony Han 	},
516609ba8e3STony Han 	{
517609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_SHA_CLK,
518609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
519609ba8e3STony Han 		.pmc_id = ID_SHA
520609ba8e3STony Han 	},
521609ba8e3STony Han 	{
522609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_SDMMC0_HCLK,
523609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
524609ba8e3STony Han 		.pmc_id = ID_SDMMC0
525609ba8e3STony Han 	},
526609ba8e3STony Han 	{
527609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_SDMMC1_HCLK,
528609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
529609ba8e3STony Han 		.pmc_id = ID_SDMMC1
530609ba8e3STony Han 	},
531609ba8e3STony Han 	{
532609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_SDMMC2_HCLK,
533609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
534609ba8e3STony Han 		.pmc_id = ID_SDMMC2
535609ba8e3STony Han 	},
536609ba8e3STony Han 	{
537609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_ISC_CLK,
538609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
539609ba8e3STony Han 		.pmc_id = ID_ISC
540609ba8e3STony Han 	},
541609ba8e3STony Han 	{
542609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_QSPI0_CLK,
543609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
544609ba8e3STony Han 		.pmc_id = ID_QSPI0
545609ba8e3STony Han 	},
546609ba8e3STony Han 	{
547609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_PERIPH_QSPI1_CLK,
548609ba8e3STony Han 		.pmc_type = PMC_TYPE_PERIPHERAL,
549609ba8e3STony Han 		.pmc_id = ID_QSPI1
550609ba8e3STony Han 	},
551609ba8e3STony Han 	{
552609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_QSPI0_GCLK,
553609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
554609ba8e3STony Han 		.pmc_id = ID_QSPI0
555609ba8e3STony Han 	},
556609ba8e3STony Han 	{
557609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_QSPI1_GCLK,
558609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
559609ba8e3STony Han 		.pmc_id = ID_QSPI1
560609ba8e3STony Han 	},
561609ba8e3STony Han 	{
562609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_SDMMC0_GCLK,
563609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
564609ba8e3STony Han 		.pmc_id = ID_SDMMC0
565609ba8e3STony Han 	},
566609ba8e3STony Han 	{
567609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_SDMMC1_GCLK,
568609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
569609ba8e3STony Han 		.pmc_id = ID_SDMMC1
570609ba8e3STony Han 	},
571609ba8e3STony Han 	{
572609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_SDMMC2_GCLK,
573609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
574609ba8e3STony Han 		.pmc_id = ID_SDMMC2
575609ba8e3STony Han 	},
576609ba8e3STony Han 	{
577609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_TCB0_GCLK,
578609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
579609ba8e3STony Han 		.pmc_id = ID_TC0_CHANNEL0
580609ba8e3STony Han 	},
581609ba8e3STony Han 	{
582609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_TCB1_GCLK,
583609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
584609ba8e3STony Han 		.pmc_id = ID_TC1_CHANNEL0
585609ba8e3STony Han 	},
586609ba8e3STony Han 	{
587609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_I2S0_GCLK,
588609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
589609ba8e3STony Han 		.pmc_id = ID_I2SMCC0
590609ba8e3STony Han 	},
591609ba8e3STony Han 	{
592609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_I2S1_GCLK,
593609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
594609ba8e3STony Han 		.pmc_id = ID_I2SMCC1
595609ba8e3STony Han 	},
596609ba8e3STony Han 	{
597609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_CAN0_GCLK,
598609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
599609ba8e3STony Han 		.pmc_id = ID_MCAN0
600609ba8e3STony Han 	},
601609ba8e3STony Han 	{
602609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_CAN1_GCLK,
603609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
604609ba8e3STony Han 		.pmc_id = ID_MCAN1
605609ba8e3STony Han 	},
606609ba8e3STony Han 	{
607609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_CAN2_GCLK,
608609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
609609ba8e3STony Han 		.pmc_id = ID_MCAN2
610609ba8e3STony Han 	},
611609ba8e3STony Han 	{
612609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_CAN3_GCLK,
613609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
614609ba8e3STony Han 		.pmc_id = ID_MCAN3
615609ba8e3STony Han 	},
616609ba8e3STony Han 	{
617609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_CAN4_GCLK,
618609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
619609ba8e3STony Han 		.pmc_id = ID_MCAN4
620609ba8e3STony Han 	},
621609ba8e3STony Han 	{
622609ba8e3STony Han 		.scmi_id = AT91_SCMI_CLK_GCK_CAN5_GCLK,
623609ba8e3STony Han 		.pmc_type = PMC_TYPE_GCK,
624609ba8e3STony Han 		.pmc_id = ID_MCAN5
625609ba8e3STony Han 	},
626609ba8e3STony Han };
627609ba8e3STony Han #else
628f90d78a6STony Han static struct sam_pmc_clk pmc_clks[] = {
6292277c3f7SClément Léger 	{
6302277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_CORE_MCK,
6312277c3f7SClément Léger 		.pmc_type = PMC_TYPE_CORE,
6322277c3f7SClément Léger 		.pmc_id = PMC_MCK
6332277c3f7SClément Léger 	},
6342277c3f7SClément Léger 	{
6352277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_CORE_UTMI,
6362277c3f7SClément Léger 		.pmc_type = PMC_TYPE_CORE,
6372277c3f7SClément Léger 		.pmc_id = PMC_UTMI
6382277c3f7SClément Léger 	},
6392277c3f7SClément Léger 	{
6402277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_CORE_MAIN,
6412277c3f7SClément Léger 		.pmc_type = PMC_TYPE_CORE,
6422277c3f7SClément Léger 		.pmc_id = PMC_MAIN
6432277c3f7SClément Léger 	},
6442277c3f7SClément Léger 	{
6452277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_CORE_MCK2,
6462277c3f7SClément Léger 		.pmc_type = PMC_TYPE_CORE,
6472277c3f7SClément Léger 		.pmc_id = PMC_MCK2
6482277c3f7SClément Léger 	},
6492277c3f7SClément Léger 	{
6502277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_CORE_I2S0_MUX,
6512277c3f7SClément Léger 		.pmc_type = PMC_TYPE_CORE,
6522277c3f7SClément Léger 		.pmc_id = PMC_I2S0_MUX
6532277c3f7SClément Léger 	},
6542277c3f7SClément Léger 	{
6552277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_CORE_I2S1_MUX,
6562277c3f7SClément Léger 		.pmc_type = PMC_TYPE_CORE,
6572277c3f7SClément Léger 		.pmc_id = PMC_I2S1_MUX
6582277c3f7SClément Léger 	},
6592277c3f7SClément Léger 	{
6602277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_CORE_PLLACK,
6612277c3f7SClément Léger 		.pmc_type = PMC_TYPE_CORE,
6622277c3f7SClément Léger 		.pmc_id = PMC_PLLACK
6632277c3f7SClément Léger 	},
6642277c3f7SClément Léger 	{
6652277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_CORE_AUDIOPLLCK,
6662277c3f7SClément Léger 		.pmc_type = PMC_TYPE_CORE,
6672277c3f7SClément Léger 		.pmc_id = PMC_AUDIOPLLCK
6682277c3f7SClément Léger 	},
6692277c3f7SClément Léger 	{
6702277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_CORE_MCK_PRES,
6712277c3f7SClément Léger 		.pmc_type = PMC_TYPE_CORE,
6722277c3f7SClément Léger 		.pmc_id = PMC_MCK_PRES
6732277c3f7SClément Léger 	},
6742277c3f7SClément Léger 	{
6752277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_SYSTEM_DDRCK,
6762277c3f7SClément Léger 		.pmc_type = PMC_TYPE_SYSTEM,
6772277c3f7SClément Léger 		.pmc_id = 2
6782277c3f7SClément Léger 	},
6792277c3f7SClément Léger 	{
6802277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_SYSTEM_LCDCK,
6812277c3f7SClément Léger 		.pmc_type = PMC_TYPE_SYSTEM,
6822277c3f7SClément Léger 		.pmc_id = 3
6832277c3f7SClément Léger 	},
6842277c3f7SClément Léger 	{
6852277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_SYSTEM_UHPCK,
6862277c3f7SClément Léger 		.pmc_type = PMC_TYPE_SYSTEM,
6872277c3f7SClément Léger 		.pmc_id = 6
6882277c3f7SClément Léger 	},
6892277c3f7SClément Léger 	{
6902277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_SYSTEM_UDPCK,
6912277c3f7SClément Léger 		.pmc_type = PMC_TYPE_SYSTEM,
6922277c3f7SClément Léger 		.pmc_id = 7
6932277c3f7SClément Léger 	},
6942277c3f7SClément Léger 	{
6952277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_SYSTEM_PCK0,
6962277c3f7SClément Léger 		.pmc_type = PMC_TYPE_SYSTEM,
6972277c3f7SClément Léger 		.pmc_id = 8
6982277c3f7SClément Léger 	},
6992277c3f7SClément Léger 	{
7002277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_SYSTEM_PCK1,
7012277c3f7SClément Léger 		.pmc_type = PMC_TYPE_SYSTEM,
7022277c3f7SClément Léger 		.pmc_id = 9
7032277c3f7SClément Léger 	},
7042277c3f7SClément Léger 	{
7052277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_SYSTEM_PCK2,
7062277c3f7SClément Léger 		.pmc_type = PMC_TYPE_SYSTEM,
7072277c3f7SClément Léger 		.pmc_id = 10
7082277c3f7SClément Léger 	},
7092277c3f7SClément Léger 	{
7102277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_SYSTEM_ISCCK,
7112277c3f7SClément Léger 		.pmc_type = PMC_TYPE_SYSTEM,
7122277c3f7SClément Léger 		.pmc_id = 18
7132277c3f7SClément Léger 	},
7142277c3f7SClément Léger 	{
7152277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_MACB0_CLK,
7162277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7172277c3f7SClément Léger 		.pmc_id = 5
7182277c3f7SClément Léger 	},
7192277c3f7SClément Léger 	{
7202277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_TDES_CLK,
7212277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7222277c3f7SClément Léger 		.pmc_id = 11
7232277c3f7SClément Léger 	},
7242277c3f7SClément Léger 	{
7252277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_MATRIX1_CLK,
7262277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7272277c3f7SClément Léger 		.pmc_id = 14
7282277c3f7SClément Léger 	},
7292277c3f7SClément Léger 	{
7302277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_HSMC_CLK,
7312277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7322277c3f7SClément Léger 		.pmc_id = 17
7332277c3f7SClément Léger 	},
7342277c3f7SClément Léger 	{
7352277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_PIOA_CLK,
7362277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7372277c3f7SClément Léger 		.pmc_id = 18
7382277c3f7SClément Léger 	},
7392277c3f7SClément Léger 	{
7402277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX0_CLK,
7412277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7422277c3f7SClément Léger 		.pmc_id = 19
7432277c3f7SClément Léger 	},
7442277c3f7SClément Léger 	{
7452277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX1_CLK,
7462277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7472277c3f7SClément Léger 		.pmc_id = 20
7482277c3f7SClément Léger 	},
7492277c3f7SClément Léger 	{
7502277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX2_CLK,
7512277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7522277c3f7SClément Léger 		.pmc_id = 21
7532277c3f7SClément Léger 	},
7542277c3f7SClément Léger 	{
7552277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX3_CLK,
7562277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7572277c3f7SClément Léger 		.pmc_id = 22
7582277c3f7SClément Léger 	},
7592277c3f7SClément Léger 	{
7602277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_FLX4_CLK,
7612277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7622277c3f7SClément Léger 		.pmc_id = 23
7632277c3f7SClément Léger 	},
7642277c3f7SClément Léger 	{
7652277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_UART0_CLK,
7662277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7672277c3f7SClément Léger 		.pmc_id = 24
7682277c3f7SClément Léger 	},
7692277c3f7SClément Léger 	{
7702277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_UART1_CLK,
7712277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7722277c3f7SClément Léger 		.pmc_id = 25
7732277c3f7SClément Léger 	},
7742277c3f7SClément Léger 	{
7752277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_UART2_CLK,
7762277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7772277c3f7SClément Léger 		.pmc_id = 26
7782277c3f7SClément Léger 	},
7792277c3f7SClément Léger 	{
7802277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_UART3_CLK,
7812277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7822277c3f7SClément Léger 		.pmc_id = 27
7832277c3f7SClément Léger 	},
7842277c3f7SClément Léger 	{
7852277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_UART4_CLK,
7862277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7872277c3f7SClément Léger 		.pmc_id = 28
7882277c3f7SClément Léger 	},
7892277c3f7SClément Léger 	{
7902277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_TWI0_CLK,
7912277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7922277c3f7SClément Léger 		.pmc_id = 29
7932277c3f7SClément Léger 	},
7942277c3f7SClément Léger 	{
7952277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_TWI1_CLK,
7962277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
7972277c3f7SClément Léger 		.pmc_id = 30
7982277c3f7SClément Léger 	},
7992277c3f7SClément Léger 	{
8002277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_SPI0_CLK,
8012277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8022277c3f7SClément Léger 		.pmc_id = 33
8032277c3f7SClément Léger 	},
8042277c3f7SClément Léger 	{
8052277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_SPI1_CLK,
8062277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8072277c3f7SClément Léger 		.pmc_id = 34
8082277c3f7SClément Léger 	},
8092277c3f7SClément Léger 	{
8102277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_TCB0_CLK,
8112277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8122277c3f7SClément Léger 		.pmc_id = 35
8132277c3f7SClément Léger 	},
8142277c3f7SClément Léger 	{
8152277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_TCB1_CLK,
8162277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8172277c3f7SClément Léger 		.pmc_id = 36
8182277c3f7SClément Léger 	},
8192277c3f7SClément Léger 	{
8202277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_PWM_CLK,
8212277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8222277c3f7SClément Léger 		.pmc_id = 38
8232277c3f7SClément Léger 	},
8242277c3f7SClément Léger 	{
8252277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_ADC_CLK,
8262277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8272277c3f7SClément Léger 		.pmc_id = 40
8282277c3f7SClément Léger 	},
8292277c3f7SClément Léger 	{
8302277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_UHPHS_CLK,
8312277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8322277c3f7SClément Léger 		.pmc_id = 41
8332277c3f7SClément Léger 	},
8342277c3f7SClément Léger 	{
8352277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_UDPHS_CLK,
8362277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8372277c3f7SClément Léger 		.pmc_id = 42
8382277c3f7SClément Léger 	},
8392277c3f7SClément Léger 	{
8402277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_SSC0_CLK,
8412277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8422277c3f7SClément Léger 		.pmc_id = 43
8432277c3f7SClément Léger 	},
8442277c3f7SClément Léger 	{
8452277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_SSC1_CLK,
8462277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8472277c3f7SClément Léger 		.pmc_id = 44
8482277c3f7SClément Léger 	},
8492277c3f7SClément Léger 	{
8502277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_TRNG_CLK,
8512277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8522277c3f7SClément Léger 		.pmc_id = 47
8532277c3f7SClément Léger 	},
8542277c3f7SClément Léger 	{
8552277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_PDMIC_CLK,
8562277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8572277c3f7SClément Léger 		.pmc_id = 48
8582277c3f7SClément Léger 	},
8592277c3f7SClément Léger 	{
8602277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_SECURAM_CLK,
8612277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8622277c3f7SClément Léger 		.pmc_id = 51
8632277c3f7SClément Léger 	},
8642277c3f7SClément Léger 	{
8652277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_I2S0_CLK,
8662277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8672277c3f7SClément Léger 		.pmc_id = 54
8682277c3f7SClément Léger 	},
8692277c3f7SClément Léger 	{
8702277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_I2S1_CLK,
8712277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8722277c3f7SClément Léger 		.pmc_id = 55
8732277c3f7SClément Léger 	},
8742277c3f7SClément Léger 	{
8752277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_CAN0_CLK,
8762277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8772277c3f7SClément Léger 		.pmc_id = 56
8782277c3f7SClément Léger 	},
8792277c3f7SClément Léger 	{
8802277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_CAN1_CLK,
8812277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8822277c3f7SClément Léger 		.pmc_id = 57
8832277c3f7SClément Léger 	},
8842277c3f7SClément Léger 	{
8852277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_PTC_CLK,
8862277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8872277c3f7SClément Léger 		.pmc_id = 58
8882277c3f7SClément Léger 	},
8892277c3f7SClément Léger 	{
8902277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_CLASSD_CLK,
8912277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8922277c3f7SClément Léger 		.pmc_id = 59
8932277c3f7SClément Léger 	},
8942277c3f7SClément Léger 	{
8952277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_DMA0_CLK,
8962277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
8972277c3f7SClément Léger 		.pmc_id = 6
8982277c3f7SClément Léger 	},
8992277c3f7SClément Léger 	{
9002277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_DMA1_CLK,
9012277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
9022277c3f7SClément Léger 		.pmc_id = 7
9032277c3f7SClément Léger 	},
9042277c3f7SClément Léger 	{
9052277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_AES_CLK,
9062277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
9072277c3f7SClément Léger 		.pmc_id = 9
9082277c3f7SClément Léger 	},
9092277c3f7SClément Léger 	{
9102277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_AESB_CLK,
9112277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
9122277c3f7SClément Léger 		.pmc_id = 10
9132277c3f7SClément Léger 	},
9142277c3f7SClément Léger 	{
9152277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_SHA_CLK,
9162277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
9172277c3f7SClément Léger 		.pmc_id = 12
9182277c3f7SClément Léger 	},
9192277c3f7SClément Léger 	{
9202277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_MPDDR_CLK,
9212277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
9222277c3f7SClément Léger 		.pmc_id = 13
9232277c3f7SClément Léger 	},
9242277c3f7SClément Léger 	{
9252277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_MATRIX0_CLK,
9262277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
9272277c3f7SClément Léger 		.pmc_id = 15
9282277c3f7SClément Léger 	},
9292277c3f7SClément Léger 	{
9302277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_SDMMC0_HCLK,
9312277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
9322277c3f7SClément Léger 		.pmc_id = 31
9332277c3f7SClément Léger 	},
9342277c3f7SClément Léger 	{
9352277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_SDMMC1_HCLK,
9362277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
9372277c3f7SClément Léger 		.pmc_id = 32
9382277c3f7SClément Léger 	},
9392277c3f7SClément Léger 	{
9402277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_LCDC_CLK,
9412277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
9422277c3f7SClément Léger 		.pmc_id = 45
9432277c3f7SClément Léger 	},
9442277c3f7SClément Léger 	{
9452277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_ISC_CLK,
9462277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
9472277c3f7SClément Léger 		.pmc_id = 46
9482277c3f7SClément Léger 	},
9492277c3f7SClément Léger 	{
9502277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_QSPI0_CLK,
9512277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
9522277c3f7SClément Léger 		.pmc_id = 52
9532277c3f7SClément Léger 	},
9542277c3f7SClément Léger 	{
9552277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PERIPH_QSPI1_CLK,
9562277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PERIPHERAL,
9572277c3f7SClément Léger 		.pmc_id = 53
9582277c3f7SClément Léger 	},
9592277c3f7SClément Léger 	{
9602277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_GCK_SDMMC0_GCLK,
9612277c3f7SClément Léger 		.pmc_type = PMC_TYPE_GCK,
9622277c3f7SClément Léger 		.pmc_id = 31
9632277c3f7SClément Léger 	},
9642277c3f7SClément Léger 	{
9652277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_GCK_SDMMC1_GCLK,
9662277c3f7SClément Léger 		.pmc_type = PMC_TYPE_GCK,
9672277c3f7SClément Léger 		.pmc_id = 32
9682277c3f7SClément Léger 	},
9692277c3f7SClément Léger 	{
9702277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_GCK_TCB0_GCLK,
9712277c3f7SClément Léger 		.pmc_type = PMC_TYPE_GCK,
9722277c3f7SClément Léger 		.pmc_id = 35
9732277c3f7SClément Léger 	},
9742277c3f7SClément Léger 	{
9752277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_GCK_TCB1_GCLK,
9762277c3f7SClément Léger 		.pmc_type = PMC_TYPE_GCK,
9772277c3f7SClément Léger 		.pmc_id = 36
9782277c3f7SClément Léger 	},
9792277c3f7SClément Léger 	{
9802277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_GCK_PWM_GCLK,
9812277c3f7SClément Léger 		.pmc_type = PMC_TYPE_GCK,
9822277c3f7SClément Léger 		.pmc_id = 38
9832277c3f7SClément Léger 	},
9842277c3f7SClément Léger 	{
9852277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_GCK_ISC_GCLK,
9862277c3f7SClément Léger 		.pmc_type = PMC_TYPE_GCK,
9872277c3f7SClément Léger 		.pmc_id = 46
9882277c3f7SClément Léger 	},
9892277c3f7SClément Léger 	{
9902277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_GCK_PDMIC_GCLK,
9912277c3f7SClément Léger 		.pmc_type = PMC_TYPE_GCK,
9922277c3f7SClément Léger 		.pmc_id = 48
9932277c3f7SClément Léger 	},
9942277c3f7SClément Léger 	{
9952277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_GCK_I2S0_GCLK,
9962277c3f7SClément Léger 		.pmc_type = PMC_TYPE_GCK,
9972277c3f7SClément Léger 		.pmc_id = 54
9982277c3f7SClément Léger 	},
9992277c3f7SClément Léger 	{
10002277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_GCK_I2S1_GCLK,
10012277c3f7SClément Léger 		.pmc_type = PMC_TYPE_GCK,
10022277c3f7SClément Léger 		.pmc_id = 55
10032277c3f7SClément Léger 	},
10042277c3f7SClément Léger 	{
10052277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_GCK_CAN0_GCLK,
10062277c3f7SClément Léger 		.pmc_type = PMC_TYPE_GCK,
10072277c3f7SClément Léger 		.pmc_id = 56
10082277c3f7SClément Léger 	},
10092277c3f7SClément Léger 	{
10102277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_GCK_CAN1_GCLK,
10112277c3f7SClément Léger 		.pmc_type = PMC_TYPE_GCK,
10122277c3f7SClément Léger 		.pmc_id = 57
10132277c3f7SClément Léger 	},
10142277c3f7SClément Léger 	{
10152277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_GCK_CLASSD_GCLK,
10162277c3f7SClément Léger 		.pmc_type = PMC_TYPE_GCK,
10172277c3f7SClément Léger 		.pmc_id = 59
10182277c3f7SClément Léger 	},
10192277c3f7SClément Léger 	{
10202277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PROG_PROG0,
10212277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PROGRAMMABLE,
10222277c3f7SClément Léger 		.pmc_id = 0
10232277c3f7SClément Léger 	},
10242277c3f7SClément Léger 	{
10252277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PROG_PROG1,
10262277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PROGRAMMABLE,
10272277c3f7SClément Léger 		.pmc_id = 1
10282277c3f7SClément Léger 	},
10292277c3f7SClément Léger 	{
10302277c3f7SClément Léger 		.scmi_id = AT91_SCMI_CLK_PROG_PROG2,
10312277c3f7SClément Léger 		.pmc_type = PMC_TYPE_PROGRAMMABLE,
10322277c3f7SClément Léger 		.pmc_id = 2
10332277c3f7SClément Léger 	},
10342277c3f7SClément Léger };
1035609ba8e3STony Han #endif
10362277c3f7SClément Léger 
sam_init_scmi_clk(void)10372277c3f7SClément Léger static TEE_Result sam_init_scmi_clk(void)
10382277c3f7SClément Léger {
10392277c3f7SClément Léger 	unsigned int i = 0;
10402277c3f7SClément Léger 	struct clk *clk = NULL;
10412277c3f7SClément Léger 	TEE_Result res = TEE_ERROR_GENERIC;
1042609ba8e3STony Han 	const struct sam_pmc_clk *pmc_clk = NULL;
10432277c3f7SClément Léger 
10442277c3f7SClément Léger 	for (i = 0; i < ARRAY_SIZE(pmc_clks); i++) {
10452277c3f7SClément Léger 		pmc_clk = &pmc_clks[i];
10462277c3f7SClément Léger 		res = at91_pmc_clk_get(pmc_clk->pmc_type, pmc_clk->pmc_id,
10472277c3f7SClément Léger 				       &clk);
10482277c3f7SClément Léger 		if (res) {
10492277c3f7SClément Léger 			EMSG("Failed to get PMC clock type %u, id %u",
10502277c3f7SClément Léger 			     pmc_clk->pmc_type, pmc_clk->pmc_id);
10512277c3f7SClément Léger 			return res;
10522277c3f7SClément Léger 		}
10532277c3f7SClément Léger 		res = scmi_clk_add(clk, 0, pmc_clk->scmi_id);
10542277c3f7SClément Léger 		if (res) {
10552277c3f7SClément Léger 			EMSG("Failed to add PMC SCMI clock id %u",
10562277c3f7SClément Léger 			     pmc_clk->scmi_id);
10572277c3f7SClément Léger 			return res;
10582277c3f7SClément Léger 		}
10592277c3f7SClément Léger 	}
10602277c3f7SClément Léger 
10612277c3f7SClément Léger 	clk = at91_sckc_clk_get();
10622277c3f7SClément Léger 	if (!clk)
10632277c3f7SClément Léger 		return TEE_ERROR_GENERIC;
10642277c3f7SClément Léger 
10652277c3f7SClément Léger 	res = scmi_clk_add(clk, 0, AT91_SCMI_CLK_SCKC_SLOWCK_32K);
10662277c3f7SClément Léger 	if (res) {
10672277c3f7SClément Léger 		EMSG("Failed to add slow clock to SCMI clocks");
10682277c3f7SClément Léger 		return res;
10692277c3f7SClément Léger 	}
10702277c3f7SClément Léger 
1071b432ec14STony Han 	clk = at91_cpu_opp_clk_get();
1072b432ec14STony Han 	if (clk) {
1073b432ec14STony Han 		res = scmi_clk_add(clk, 0, AT91_SCMI_CLK_CPU_OPP);
1074b432ec14STony Han 		if (res) {
1075b432ec14STony Han 			EMSG("Failed to add CPU OPP clock to SCMI clocks");
1076b432ec14STony Han 			return res;
1077b432ec14STony Han 		}
1078b432ec14STony Han 	}
1079b432ec14STony Han 
10802277c3f7SClément Léger 	return TEE_SUCCESS;
10812277c3f7SClément Léger }
10822277c3f7SClément Léger 
find_rd(unsigned int channel_id,unsigned int scmi_id)10833f788a22STony Han static struct sam_scmi_rd *find_rd(unsigned int channel_id,
10843f788a22STony Han 				   unsigned int scmi_id)
10853f788a22STony Han {
10863f788a22STony Han 	const struct channel_resources *resource = find_resource(channel_id);
10873f788a22STony Han 
10883f788a22STony Han 	if (resource && scmi_id < resource->rd_count)
10893f788a22STony Han 		return &resource->rd[scmi_id];
10903f788a22STony Han 
10913f788a22STony Han 	return NULL;
10923f788a22STony Han }
10933f788a22STony Han 
plat_scmi_rd_set_state(unsigned int channel_id,unsigned int scmi_id,bool assert_not_deassert)10943f788a22STony Han int32_t plat_scmi_rd_set_state(unsigned int channel_id, unsigned int scmi_id,
10953f788a22STony Han 			       bool assert_not_deassert)
10963f788a22STony Han {
10973f788a22STony Han 	const struct sam_scmi_rd *rd = find_rd(channel_id, scmi_id);
10983f788a22STony Han 	TEE_Result res = TEE_ERROR_GENERIC;
10993f788a22STony Han 
11003f788a22STony Han 	if (!rd)
11013f788a22STony Han 		return SCMI_NOT_FOUND;
11023f788a22STony Han 
11033f788a22STony Han 	if (!rd->rstctrl)
11043f788a22STony Han 		return SCMI_DENIED;
11053f788a22STony Han 
11063f788a22STony Han 	if (assert_not_deassert) {
11073f788a22STony Han 		FMSG("SCMI reset %u set", scmi_id);
11083f788a22STony Han 		res = rstctrl_assert(rd->rstctrl);
11093f788a22STony Han 	} else {
11103f788a22STony Han 		FMSG("SCMI reset %u release", scmi_id);
11113f788a22STony Han 		res = rstctrl_deassert(rd->rstctrl);
11123f788a22STony Han 	}
11133f788a22STony Han 
11143f788a22STony Han 	if (res)
11153f788a22STony Han 		return SCMI_HARDWARE_ERROR;
11163f788a22STony Han 
11173f788a22STony Han 	return SCMI_SUCCESS;
11183f788a22STony Han }
11193f788a22STony Han 
plat_scmi_rd_count(unsigned int channel_id)11203f788a22STony Han size_t plat_scmi_rd_count(unsigned int channel_id)
11213f788a22STony Han {
11223f788a22STony Han 	const struct channel_resources *resource = find_resource(channel_id);
11233f788a22STony Han 
11243f788a22STony Han 	if (!resource)
11253f788a22STony Han 		return 0;
11263f788a22STony Han 
11273f788a22STony Han 	return resource->rd_count;
11283f788a22STony Han }
11293f788a22STony Han 
sam_set_clock_range(unsigned int pmc_type,unsigned int pmc_id,const struct clk_range * range)1130f90d78a6STony Han void sam_set_clock_range(unsigned int pmc_type, unsigned int pmc_id,
1131f90d78a6STony Han 			 const struct clk_range *range)
1132f90d78a6STony Han {
1133f90d78a6STony Han 	struct sam_pmc_clk *p = NULL;
1134f90d78a6STony Han 
1135f90d78a6STony Han 	for (p = pmc_clks; p < pmc_clks + ARRAY_SIZE(pmc_clks); p++) {
1136f90d78a6STony Han 		if (pmc_type == p->pmc_type && pmc_id == p->pmc_id) {
1137f90d78a6STony Han 			p->output_range.min = range->min;
1138f90d78a6STony Han 			p->output_range.max = range->max;
1139f90d78a6STony Han 			return;
1140f90d78a6STony Han 		}
1141f90d78a6STony Han 	}
1142f90d78a6STony Han }
1143f90d78a6STony Han 
plat_scmi_clock_rates_by_step(unsigned int channel_id,unsigned int scmi_id,unsigned long * steps)1144f90d78a6STony Han int32_t plat_scmi_clock_rates_by_step(unsigned int channel_id,
1145f90d78a6STony Han 				      unsigned int scmi_id,
1146f90d78a6STony Han 				      unsigned long *steps)
1147f90d78a6STony Han {
1148f90d78a6STony Han 	const struct sam_pmc_clk *p = NULL;
1149f90d78a6STony Han 	int32_t res = SCMI_NOT_SUPPORTED;
1150f90d78a6STony Han 
1151f90d78a6STony Han 	if (channel_id)
1152f90d78a6STony Han 		return res;
1153f90d78a6STony Han 
1154f90d78a6STony Han 	for (p = pmc_clks; p < pmc_clks + ARRAY_SIZE(pmc_clks); p++) {
1155f90d78a6STony Han 		if (scmi_id == p->scmi_id) {
1156f90d78a6STony Han 			if (p->output_range.max) {
1157f90d78a6STony Han 				steps[0] = p->output_range.min;
1158f90d78a6STony Han 				steps[1] = p->output_range.max;
1159f90d78a6STony Han 				steps[2] = 1;
1160f90d78a6STony Han 				res = SCMI_SUCCESS;
1161f90d78a6STony Han 			}
1162f90d78a6STony Han 			break;
1163f90d78a6STony Han 		}
1164f90d78a6STony Han 	}
1165f90d78a6STony Han 
1166f90d78a6STony Han 	return res;
1167f90d78a6STony Han }
1168f90d78a6STony Han 
11693ae16402SClément Léger /*
11703ae16402SClément Léger  * Initialize platform SCMI resources
11713ae16402SClément Léger  */
sam_init_scmi_server(void)11723ae16402SClément Léger static TEE_Result sam_init_scmi_server(void)
11733ae16402SClément Léger {
11743ae16402SClément Léger 	size_t i = 0;
11753f788a22STony Han 	size_t j = 0;
11763ae16402SClément Léger 
11773ae16402SClément Léger 	for (i = 0; i < ARRAY_SIZE(scmi_channel); i++) {
11783ae16402SClément Léger 		const struct channel_resources *res = scmi_channel + i;
11793ae16402SClément Léger 		struct scmi_msg_channel *chan = res->channel;
11803ae16402SClément Léger 
11813ae16402SClément Léger 		/* Enforce non-secure shm mapped as device memory */
11823ae16402SClément Léger 		chan->shm_addr.va = (vaddr_t)phys_to_virt(chan->shm_addr.pa,
11833ae16402SClément Léger 							  MEM_AREA_IO_NSEC, 1);
11843ae16402SClément Léger 		assert(chan->shm_addr.va);
11853ae16402SClément Léger 
11863ae16402SClément Léger 		scmi_smt_init_agent_channel(chan);
11873f788a22STony Han 
11883f788a22STony Han 		for (j = 0; j < res->rd_count; j++) {
11893f788a22STony Han 			struct sam_scmi_rd *rd = &res->rd[j];
11903f788a22STony Han 			struct rstctrl *rstctrl = NULL;
11913f788a22STony Han 
11923f788a22STony Han 			rstctrl = sam_get_rstctrl(rd->reset_id);
11933f788a22STony Han 			assert(rstctrl);
11943f788a22STony Han 			if (rstctrl_get_exclusive(rstctrl))
11953f788a22STony Han 				continue;
11963f788a22STony Han 
11973f788a22STony Han 			rd->rstctrl = rstctrl;
11983f788a22STony Han 		}
11993ae16402SClément Léger 	}
12003ae16402SClément Léger 
12012277c3f7SClément Léger 	return sam_init_scmi_clk();
12023ae16402SClément Léger }
12033ae16402SClément Léger 
12043ae16402SClément Léger driver_init_late(sam_init_scmi_server);
1205