1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 3 #include <stdint.h> 4 #include <amdblocks/acpimmio.h> 5 #include <amdblocks/aoac.h> 6 #include <soc/aoac_defs.h> 7 #include <soc/southbridge.h> 8 #include <delay.h> 9 10 #define FCH_AOAC_UART_FOR_CONSOLE \ 11 (CONFIG_UART_FOR_CONSOLE == 0 ? FCH_AOAC_DEV_UART0 \ 12 : CONFIG_UART_FOR_CONSOLE == 1 ? FCH_AOAC_DEV_UART1 \ 13 : CONFIG_UART_FOR_CONSOLE == 2 ? FCH_AOAC_DEV_UART2 \ 14 : CONFIG_UART_FOR_CONSOLE == 3 ? FCH_AOAC_DEV_UART3 \ 15 : -1) 16 #if CONFIG(AMD_SOC_CONSOLE_UART) && FCH_AOAC_UART_FOR_CONSOLE == -1 17 # error Unsupported UART_FOR_CONSOLE chosen 18 #endif 19 20 /* 21 * Table of devices that need their AOAC registers enabled and waited 22 * upon (usually about .55 milliseconds). Instead of individual delays 23 * waiting for each device to become available, a single delay will be 24 * executed. The console UART is handled separately from this table. 25 */ 26 static const unsigned int aoac_devs[] = { 27 FCH_AOAC_DEV_AMBA, 28 FCH_AOAC_DEV_I2C2, 29 FCH_AOAC_DEV_I2C3, 30 FCH_AOAC_DEV_I2C4, 31 FCH_AOAC_DEV_ESPI, 32 }; 33 wait_for_aoac_enabled(unsigned int dev)34void wait_for_aoac_enabled(unsigned int dev) 35 { 36 while (!is_aoac_device_enabled(dev)) 37 udelay(100); 38 } 39 enable_aoac_devices(void)40void enable_aoac_devices(void) 41 { 42 unsigned int i; 43 44 for (i = 0; i < ARRAY_SIZE(aoac_devs); i++) 45 power_on_aoac_device(aoac_devs[i]); 46 47 if (CONFIG(AMD_SOC_CONSOLE_UART)) 48 power_on_aoac_device(FCH_AOAC_UART_FOR_CONSOLE); 49 50 /* Wait for AOAC devices to indicate power and clock OK */ 51 for (i = 0; i < ARRAY_SIZE(aoac_devs); i++) 52 wait_for_aoac_enabled(aoac_devs[i]); 53 54 if (CONFIG(AMD_SOC_CONSOLE_UART)) 55 wait_for_aoac_enabled(FCH_AOAC_UART_FOR_CONSOLE); 56 } 57