xref: /optee_os/core/arch/arm/plat-sam/sam_sfr.c (revision 6370f75d6fcce3e7bdb81190086422d58a20da91)
10a03b33dSClément Léger // SPDX-License-Identifier: BSD-2-Clause
20a03b33dSClément Léger /*
30a03b33dSClément Léger  * Copyright (C) 2017 Timesys Corporation.
40a03b33dSClément Léger  * Copyright (C) 2021 Microchip
50a03b33dSClément Léger  * All rights reserved.
60a03b33dSClément Léger  */
70a03b33dSClément Léger 
89ee67465SClément Léger #include <io.h>
9bbbbab0eSClément Léger #include <kernel/dt.h>
109e3c57c8SEtienne Carriere #include <kernel/dt_driver.h>
11bbbbab0eSClément Léger #include <matrix.h>
120a03b33dSClément Léger #include <mm/core_memprot.h>
130a03b33dSClément Léger #include <mm/core_mmu.h>
140a03b33dSClément Léger #include <sam_sfr.h>
15*6370f75dSTony Han #include <platform_config.h>
160a03b33dSClément Léger #include <types_ext.h>
170a03b33dSClément Léger 
180a03b33dSClément Léger register_phys_mem_pgdir(MEM_AREA_IO_SEC, SFR_BASE, CORE_MMU_PGDIR_SIZE);
190a03b33dSClément Léger 
sam_sfr_base(void)200a03b33dSClément Léger vaddr_t sam_sfr_base(void)
210a03b33dSClément Léger {
220a03b33dSClément Léger 	static void *va;
230a03b33dSClément Léger 
242ac05359SClément Léger 	if (!cpu_mmu_enabled())
252ac05359SClément Léger 		return SFR_BASE;
262ac05359SClément Léger 
270a03b33dSClément Léger 	if (!va)
280a03b33dSClément Léger 		va = phys_to_virt(SFR_BASE, MEM_AREA_IO_SEC, 1);
292ac05359SClément Léger 
300a03b33dSClément Léger 	return (vaddr_t)va;
310a03b33dSClément Léger }
32bbbbab0eSClément Léger 
atmel_sfr_set_usb_suspend(bool set)339ee67465SClément Léger void atmel_sfr_set_usb_suspend(bool set)
349ee67465SClément Léger {
359ee67465SClément Léger 	if (set)
369ee67465SClément Léger 		io_setbits32(sam_sfr_base() + AT91_SFR_OHCIICR,
379ee67465SClément Léger 			     AT91_OHCIICR_USB_SUSPEND);
389ee67465SClément Léger 	else
399ee67465SClément Léger 		io_clrbits32(sam_sfr_base() + AT91_SFR_OHCIICR,
409ee67465SClément Léger 			     AT91_OHCIICR_USB_SUSPEND);
419ee67465SClément Léger }
429ee67465SClément Léger 
atmel_sfr_probe(const void * fdt,int node,const void * compat_data __unused)43bbbbab0eSClément Léger static TEE_Result atmel_sfr_probe(const void *fdt, int node,
44bbbbab0eSClément Léger 				  const void *compat_data __unused)
45bbbbab0eSClément Léger {
46f354a5d8SGatien Chevallier 	if (fdt_get_status(fdt, node) == DT_STATUS_OK_SEC)
47bbbbab0eSClément Léger 		matrix_configure_periph_secure(AT91C_ID_SFR);
48bbbbab0eSClément Léger 
49bbbbab0eSClément Léger 	return TEE_SUCCESS;
50bbbbab0eSClément Léger }
51bbbbab0eSClément Léger 
52bbbbab0eSClément Léger static const struct dt_device_match atmel_sfr_match_table[] = {
53bbbbab0eSClément Léger 	{ .compatible = "atmel,sama5d2-sfr" },
54bbbbab0eSClément Léger 	{ }
55bbbbab0eSClément Léger };
56bbbbab0eSClément Léger 
57bbbbab0eSClément Léger DEFINE_DT_DRIVER(atmel_sfr_dt_driver) = {
58bbbbab0eSClément Léger 	.name = "atmel_sfr",
59bbbbab0eSClément Léger 	.type = DT_DRIVER_NOTYPE,
60bbbbab0eSClément Léger 	.match_table = atmel_sfr_match_table,
61bbbbab0eSClément Léger 	.probe = atmel_sfr_probe,
62bbbbab0eSClément Léger };
63