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