1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <lib/mmio.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include "imx8_mu.h" 10*91f16700Schasinglulu 11*91f16700Schasinglulu void MU_Resume(uint32_t base) 12*91f16700Schasinglulu { 13*91f16700Schasinglulu uint32_t reg, i; 14*91f16700Schasinglulu 15*91f16700Schasinglulu reg = mmio_read_32(base + MU_ACR_OFFSET1); 16*91f16700Schasinglulu /* Clear GIEn, RIEn, TIEn, GIRn and ABFn. */ 17*91f16700Schasinglulu reg &= ~(MU_CR_GIEn_MASK1 | MU_CR_RIEn_MASK1 | MU_CR_TIEn_MASK1 18*91f16700Schasinglulu | MU_CR_GIRn_MASK1 | MU_CR_Fn_MASK1); 19*91f16700Schasinglulu mmio_write_32(base + MU_ACR_OFFSET1, reg); 20*91f16700Schasinglulu 21*91f16700Schasinglulu /* Enable all RX interrupts */ 22*91f16700Schasinglulu for (i = 0; i < MU_RR_COUNT; i++) 23*91f16700Schasinglulu MU_EnableRxFullInt(base, i); 24*91f16700Schasinglulu } 25*91f16700Schasinglulu 26*91f16700Schasinglulu void MU_EnableRxFullInt(uint32_t base, uint32_t index) 27*91f16700Schasinglulu { 28*91f16700Schasinglulu uint32_t reg = mmio_read_32(base + MU_ACR_OFFSET1); 29*91f16700Schasinglulu 30*91f16700Schasinglulu reg &= ~(MU_CR_GIRn_MASK1 | MU_CR_NMI_MASK1); 31*91f16700Schasinglulu reg |= MU_CR_RIE0_MASK1 >> index; 32*91f16700Schasinglulu mmio_write_32(base + MU_ACR_OFFSET1, reg); 33*91f16700Schasinglulu } 34*91f16700Schasinglulu 35*91f16700Schasinglulu void MU_EnableGeneralInt(uint32_t base, uint32_t index) 36*91f16700Schasinglulu { 37*91f16700Schasinglulu uint32_t reg = mmio_read_32(base + MU_ACR_OFFSET1); 38*91f16700Schasinglulu 39*91f16700Schasinglulu reg &= ~(MU_CR_GIRn_MASK1 | MU_CR_NMI_MASK1); 40*91f16700Schasinglulu reg |= MU_CR_GIE0_MASK1 >> index; 41*91f16700Schasinglulu mmio_write_32(base + MU_ACR_OFFSET1, reg); 42*91f16700Schasinglulu } 43*91f16700Schasinglulu 44*91f16700Schasinglulu void MU_SendMessage(uint32_t base, uint32_t regIndex, uint32_t msg) 45*91f16700Schasinglulu { 46*91f16700Schasinglulu uint32_t mask = MU_SR_TE0_MASK1 >> regIndex; 47*91f16700Schasinglulu 48*91f16700Schasinglulu /* Wait TX register to be empty. */ 49*91f16700Schasinglulu while (!(mmio_read_32(base + MU_ASR_OFFSET1) & mask)) 50*91f16700Schasinglulu ; 51*91f16700Schasinglulu mmio_write_32(base + MU_ATR0_OFFSET1 + (regIndex * 4), msg); 52*91f16700Schasinglulu } 53*91f16700Schasinglulu 54*91f16700Schasinglulu void MU_ReceiveMsg(uint32_t base, uint32_t regIndex, uint32_t *msg) 55*91f16700Schasinglulu { 56*91f16700Schasinglulu uint32_t mask = MU_SR_RF0_MASK1 >> regIndex; 57*91f16700Schasinglulu 58*91f16700Schasinglulu /* Wait RX register to be full. */ 59*91f16700Schasinglulu while (!(mmio_read_32(base + MU_ASR_OFFSET1) & mask)) 60*91f16700Schasinglulu ; 61*91f16700Schasinglulu *msg = mmio_read_32(base + MU_ARR0_OFFSET1 + (regIndex * 4)); 62*91f16700Schasinglulu } 63*91f16700Schasinglulu 64*91f16700Schasinglulu void MU_Init(uint32_t base) 65*91f16700Schasinglulu { 66*91f16700Schasinglulu uint32_t reg; 67*91f16700Schasinglulu 68*91f16700Schasinglulu reg = mmio_read_32(base + MU_ACR_OFFSET1); 69*91f16700Schasinglulu /* Clear GIEn, RIEn, TIEn, GIRn and ABFn. */ 70*91f16700Schasinglulu reg &= ~(MU_CR_GIEn_MASK1 | MU_CR_RIEn_MASK1 | MU_CR_TIEn_MASK1 71*91f16700Schasinglulu | MU_CR_GIRn_MASK1 | MU_CR_Fn_MASK1); 72*91f16700Schasinglulu mmio_write_32(base + MU_ACR_OFFSET1, reg); 73*91f16700Schasinglulu } 74