blob: 7fd839bf46fedd8b66e2f4fbf7c936f025aeae3c [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>
Raul E Rangeld53c2812020-06-11 14:06:11 -06006#include <soc/southbridge.h>
7#include <delay.h>
8
9#define FCH_AOAC_UART_FOR_CONSOLE \
10 (CONFIG_UART_FOR_CONSOLE == 0 ? FCH_AOAC_DEV_UART0 \
11 : CONFIG_UART_FOR_CONSOLE == 1 ? FCH_AOAC_DEV_UART1 \
12 : CONFIG_UART_FOR_CONSOLE == 2 ? FCH_AOAC_DEV_UART2 \
13 : CONFIG_UART_FOR_CONSOLE == 3 ? FCH_AOAC_DEV_UART3 \
14 : -1)
15#if FCH_AOAC_UART_FOR_CONSOLE == -1
16# error Unsupported UART_FOR_CONSOLE chosen
17#endif
18
19/*
20 * Table of devices that need their AOAC registers enabled and waited
21 * upon (usually about .55 milliseconds). Instead of individual delays
22 * waiting for each device to become available, a single delay will be
23 * executed. The console UART is handled separately from this table.
24 */
Felix Held0d57f422020-11-30 20:26:38 +010025const static unsigned int aoac_devs[] = {
Raul E Rangeld53c2812020-06-11 14:06:11 -060026 FCH_AOAC_DEV_AMBA,
27 FCH_AOAC_DEV_I2C2,
28 FCH_AOAC_DEV_I2C3,
29 FCH_AOAC_DEV_I2C4,
30 FCH_AOAC_DEV_ESPI,
31};
32
Felix Held6c61b4b2020-09-12 01:01:43 +020033void wait_for_aoac_enabled(unsigned int dev)
Raul E Rangeld53c2812020-06-11 14:06:11 -060034{
Raul E Rangel5591b912020-06-11 16:53:57 -060035 while (!is_aoac_device_enabled(dev))
36 udelay(100);
Raul E Rangeld53c2812020-06-11 14:06:11 -060037}
38
39void enable_aoac_devices(void)
40{
Felix Held6c61b4b2020-09-12 01:01:43 +020041 unsigned int i;
Raul E Rangeld53c2812020-06-11 14:06:11 -060042
43 for (i = 0; i < ARRAY_SIZE(aoac_devs); i++)
44 power_on_aoac_device(aoac_devs[i]);
Raul E Rangel5591b912020-06-11 16:53:57 -060045
Felix Held097e4492020-06-16 15:35:20 +020046 if (CONFIG(PICASSO_CONSOLE_UART))
Raul E Rangel5591b912020-06-11 16:53:57 -060047 power_on_aoac_device(FCH_AOAC_UART_FOR_CONSOLE);
Raul E Rangeld53c2812020-06-11 14:06:11 -060048
49 /* Wait for AOAC devices to indicate power and clock OK */
Raul E Rangel5591b912020-06-11 16:53:57 -060050 for (i = 0; i < ARRAY_SIZE(aoac_devs); i++)
51 wait_for_aoac_enabled(aoac_devs[i]);
52
Felix Held097e4492020-06-16 15:35:20 +020053 if (CONFIG(PICASSO_CONSOLE_UART))
Raul E Rangel5591b912020-06-11 16:53:57 -060054 wait_for_aoac_enabled(FCH_AOAC_UART_FOR_CONSOLE);
Raul E Rangeld53c2812020-06-11 14:06:11 -060055}