149a64134SBryan O'Donoghue /* 249a64134SBryan O'Donoghue * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 349a64134SBryan O'Donoghue * 449a64134SBryan O'Donoghue * SPDX-License-Identifier: BSD-3-Clause 549a64134SBryan O'Donoghue */ 649a64134SBryan O'Donoghue 7*09d40e0eSAntonio Nino Diaz #include <lib/mmio.h> 8*09d40e0eSAntonio Nino Diaz #include <lib/utils_def.h> 9*09d40e0eSAntonio Nino Diaz 1049a64134SBryan O'Donoghue #include <imx_aips.h> 1149a64134SBryan O'Donoghue #include <imx_regs.h> 1249a64134SBryan O'Donoghue 1349a64134SBryan O'Donoghue static void imx_aips_set_default_access(struct aipstz_regs *aips_regs) 1449a64134SBryan O'Donoghue { 1549a64134SBryan O'Donoghue int i; 1649a64134SBryan O'Donoghue uintptr_t addr; 1749a64134SBryan O'Donoghue 1849a64134SBryan O'Donoghue /* 1949a64134SBryan O'Donoghue * See section 4.7.7.1 AIPSTZ_MPR field descriptions 2049a64134SBryan O'Donoghue * i.MX 7Solo Applications Processor Reference Manual, Rev. 0.1, 08/2016 2149a64134SBryan O'Donoghue * 0111 -> 2249a64134SBryan O'Donoghue * 0: Write Access from master not buffered 2349a64134SBryan O'Donoghue * 1: Master is trusted for read access 2449a64134SBryan O'Donoghue * 1: Master is trsuted for write access 2549a64134SBryan O'Donoghue * 1: Access from master is not forced to user mode 2649a64134SBryan O'Donoghue */ 2749a64134SBryan O'Donoghue addr = (uintptr_t)&aips_regs->aipstz_mpr; 2849a64134SBryan O'Donoghue mmio_write_32(addr, 0x77777777); 2949a64134SBryan O'Donoghue 3049a64134SBryan O'Donoghue /* 3149a64134SBryan O'Donoghue * Helpfully the OPACR registers have the logical inversion of the above 3249a64134SBryan O'Donoghue * See section 4.7.7.1 AIPSTZ_MPR field descriptions 3349a64134SBryan O'Donoghue * i.MX 7Solo Applications Processor Reference Manual, Rev. 0.1, 08/2016 3449a64134SBryan O'Donoghue * 0000 -> 3549a64134SBryan O'Donoghue * 0: Write Access to the peripheral is not buffered by AIPSTZ 3649a64134SBryan O'Donoghue * 0: The peripheral does not require supervisor priv to access 3749a64134SBryan O'Donoghue * 0: Master is trsuted for write access 3849a64134SBryan O'Donoghue * 0: Access from master is not forced to user mode 3949a64134SBryan O'Donoghue */ 4049a64134SBryan O'Donoghue for (i = 0; i < AIPSTZ_OAPCR_COUNT; i++) { 4149a64134SBryan O'Donoghue addr = (uintptr_t)&aips_regs->aipstz_opacr[i]; 4249a64134SBryan O'Donoghue mmio_write_32(addr, 0x00000000); 4349a64134SBryan O'Donoghue } 4449a64134SBryan O'Donoghue } 4549a64134SBryan O'Donoghue 4649a64134SBryan O'Donoghue void imx_aips_init(void) 4749a64134SBryan O'Donoghue { 4849a64134SBryan O'Donoghue int i; 4949a64134SBryan O'Donoghue struct aipstz_regs *aips_regs[] = { 5049a64134SBryan O'Donoghue (struct aipstz_regs *)(AIPS1_BASE + AIPSTZ_CONFIG_OFFSET), 5149a64134SBryan O'Donoghue (struct aipstz_regs *)(AIPS2_BASE + AIPSTZ_CONFIG_OFFSET), 5249a64134SBryan O'Donoghue (struct aipstz_regs *)(AIPS3_BASE + AIPSTZ_CONFIG_OFFSET), 5349a64134SBryan O'Donoghue }; 5449a64134SBryan O'Donoghue 5549a64134SBryan O'Donoghue for (i = 0; i < ARRAY_SIZE(aips_regs); i++) 5649a64134SBryan O'Donoghue imx_aips_set_default_access(aips_regs[i]); 5749a64134SBryan O'Donoghue } 58