1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright (C) 2017 Timesys Corporation. 4 * Copyright (C) 2021 Microchip 5 * All rights reserved. 6 */ 7 8 #include <io.h> 9 #include <kernel/dt.h> 10 #include <matrix.h> 11 #include <mm/core_memprot.h> 12 #include <mm/core_mmu.h> 13 #include <sam_sfr.h> 14 #include <sama5d2.h> 15 #include <types_ext.h> 16 17 register_phys_mem_pgdir(MEM_AREA_IO_SEC, SFR_BASE, CORE_MMU_PGDIR_SIZE); 18 19 vaddr_t sam_sfr_base(void) 20 { 21 static void *va; 22 23 if (!cpu_mmu_enabled()) 24 return SFR_BASE; 25 26 if (!va) 27 va = phys_to_virt(SFR_BASE, MEM_AREA_IO_SEC, 1); 28 29 return (vaddr_t)va; 30 } 31 32 void atmel_sfr_set_usb_suspend(bool set) 33 { 34 if (set) 35 io_setbits32(sam_sfr_base() + AT91_SFR_OHCIICR, 36 AT91_OHCIICR_USB_SUSPEND); 37 else 38 io_clrbits32(sam_sfr_base() + AT91_SFR_OHCIICR, 39 AT91_OHCIICR_USB_SUSPEND); 40 } 41 42 static TEE_Result atmel_sfr_probe(const void *fdt, int node, 43 const void *compat_data __unused) 44 { 45 if (_fdt_get_status(fdt, node) == DT_STATUS_OK_SEC) 46 matrix_configure_periph_secure(AT91C_ID_SFR); 47 48 return TEE_SUCCESS; 49 } 50 51 static const struct dt_device_match atmel_sfr_match_table[] = { 52 { .compatible = "atmel,sama5d2-sfr" }, 53 { } 54 }; 55 56 DEFINE_DT_DRIVER(atmel_sfr_dt_driver) = { 57 .name = "atmel_sfr", 58 .type = DT_DRIVER_NOTYPE, 59 .match_table = atmel_sfr_match_table, 60 .probe = atmel_sfr_probe, 61 }; 62