blob: 13d6be4976c6ada4ababbb954d83e1117e6f864b [file] [log] [blame]
Raul E Rangeld53c2812020-06-11 14:06:11 -06001/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <stdint.h>
4#include <amdblocks/acpimmio.h>
Felix Held5b3831c2020-11-30 17:56:59 +01005#include <amdblocks/aoac.h>
Felix Held038ed9e2021-06-15 16:24:10 +02006#include <soc/aoac_defs.h>
Raul E Rangeld53c2812020-06-11 14:06:11 -06007#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)
Felix Held0dfaf332020-12-09 16:25:18 +010016#if CONFIG(AMD_SOC_CONSOLE_UART) && FCH_AOAC_UART_FOR_CONSOLE == -1
Raul E Rangeld53c2812020-06-11 14:06:11 -060017# 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 */
Felix Held0d57f422020-11-30 20:26:38 +010026const static unsigned int aoac_devs[] = {
Raul E Rangeld53c2812020-06-11 14:06:11 -060027 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
Felix Held6c61b4b2020-09-12 01:01:43 +020034void wait_for_aoac_enabled(unsigned int dev)
Raul E Rangeld53c2812020-06-11 14:06:11 -060035{
Raul E Rangel5591b912020-06-11 16:53:57 -060036 while (!is_aoac_device_enabled(dev))
37 udelay(100);
Raul E Rangeld53c2812020-06-11 14:06:11 -060038}
39
40void enable_aoac_devices(void)
41{
Felix Held6c61b4b2020-09-12 01:01:43 +020042 unsigned int i;
Raul E Rangeld53c2812020-06-11 14:06:11 -060043
44 for (i = 0; i < ARRAY_SIZE(aoac_devs); i++)
45 power_on_aoac_device(aoac_devs[i]);
Raul E Rangel5591b912020-06-11 16:53:57 -060046
Felix Held0dfaf332020-12-09 16:25:18 +010047 if (CONFIG(AMD_SOC_CONSOLE_UART))
Raul E Rangel5591b912020-06-11 16:53:57 -060048 power_on_aoac_device(FCH_AOAC_UART_FOR_CONSOLE);
Raul E Rangeld53c2812020-06-11 14:06:11 -060049
50 /* Wait for AOAC devices to indicate power and clock OK */
Raul E Rangel5591b912020-06-11 16:53:57 -060051 for (i = 0; i < ARRAY_SIZE(aoac_devs); i++)
52 wait_for_aoac_enabled(aoac_devs[i]);
53
Felix Held0dfaf332020-12-09 16:25:18 +010054 if (CONFIG(AMD_SOC_CONSOLE_UART))
Raul E Rangel5591b912020-06-11 16:53:57 -060055 wait_for_aoac_enabled(FCH_AOAC_UART_FOR_CONSOLE);
Raul E Rangeld53c2812020-06-11 14:06:11 -060056}