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