/* SPDX-License-Identifier: GPL-2.0-only */

#include <console/cbmem_console.h>
#include <console/flash.h>
#include <console/i2c_smbus.h>
#include <console/ne2k.h>
#include <console/qemu_debugcon.h>
#include <console/simnow.h>
#include <console/spi.h>
#include <console/spkmodem.h>
#include <console/streams.h>
#include <console/system76_ec.h>
#include <console/uart.h>
#include <console/usb.h>
#include <types.h>

/* Note: when adding a new console, make sure you update the definition of
   HAS_ONLY_FAST_CONSOLES in <console.h>! */
void console_hw_init(void)
{
	__cbmemc_init();
	__spkmodem_init();
	__qemu_debugcon_init();

	__uart_init();
	__ne2k_init();
	__usbdebug_init();
	__spiconsole_init();
	__flashconsole_init();
	__system76_ec_init();
	__i2c_smbus_console_init();
	__simnow_console_init();
}

void console_interactive_tx_byte(unsigned char byte, void *data_unused)
{
	if (byte == '\n') {
		/* Some consoles want newline conversion to keep terminals happy. */
		__uart_tx_byte('\r');
		__usb_tx_byte('\r');
		__i2c_smbus_console_tx_byte('\r');
	}

	__spkmodem_tx_byte(byte);
	__qemu_debugcon_tx_byte(byte);
	__uart_tx_byte(byte);
	__ne2k_tx_byte(byte);
	__usb_tx_byte(byte);
	__spiconsole_tx_byte(byte);
	__system76_ec_tx_byte(byte);
	__i2c_smbus_console_tx_byte(byte);
	__simnow_console_tx_byte(byte);
}

void console_stored_tx_byte(unsigned char byte, void *data_unused)
{
	__flashconsole_tx_byte(byte);
	__cbmemc_tx_byte(byte);
}

void console_tx_byte(unsigned char byte)
{
	console_interactive_tx_byte(byte, NULL);
	console_stored_tx_byte(byte, NULL);
}

void console_tx_flush(void)
{
	__uart_tx_flush();
	__ne2k_tx_flush();
	__usb_tx_flush();
	__flashconsole_tx_flush();
	__system76_ec_tx_flush();
}

void console_write_line(uint8_t *buffer, size_t number_of_bytes)
{
	/* Finish displaying all of the console data if requested */
	if (number_of_bytes == 0) {
		console_tx_flush();
		return;
	}

	/* Output the console data */
	while (number_of_bytes--)
		console_tx_byte(*buffer++);
}

#if CONFIG(GDB_STUB) && (ENV_ROMSTAGE_OR_BEFORE || ENV_RAMSTAGE)
void gdb_hw_init(void)
{
	__gdb_hw_init();
}

void gdb_tx_byte(unsigned char byte)
{
	__gdb_tx_byte(byte);
}

void gdb_tx_flush(void)
{
	__gdb_tx_flush();
}

unsigned char gdb_rx_byte(void)
{
	return __gdb_rx_byte();
}
#endif
