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

#if CONFIG(ACPI_CONSOLE)

#include <soc/iomap.h>

Name (UFLG, CONFIG(CONSOLE_SERIAL))

Method (LURT, 1, Serialized)
{
	If (Arg0 == 0) { /* 0 = 0x3f8 */
		Local0 = 0x3f8
	} ElseIf (Arg0 == 1) { /* 1 = 0x2f8 */
		Local0 = 0x2f8
	} ElseIf (Arg0 == 2) { /* 2 = 0x3e8 */
		Local0 = 0x3e8
	} ElseIf (Arg0 == 3) { /* 3 = 0x2e8 */
		Local0 = 0x2e8
	}
	Return (Local0)
}

#if CONFIG(DRIVERS_UART_8250MEM_32)
OperationRegion (UBAR, SystemMemory,
			CONFIG_CONSOLE_UART_BASE_ADDRESS, 24)
Field (UBAR, AnyAcc, NoLock, Preserve)
{
	TDR, 8,	/* Transmit Data Register BAR + 0x000 */
		, 24,
	IER, 8,	/* Interrupt Enable Register BAR + 0x004 */
		, 24,
	IIR, 8,	/* Interrupt Identification Register BAR + 0x008 */
		, 24,
	LCR, 8,	/* Line Control Register BAR + 0x00C */
		, 24,
	MCR, 8,	/* Modem Control Register BAR + 0x010 */
		, 24,
	LSR, 8,	/* Line Status Register BAR + 0x014 */
		, 24
}
#else
OperationRegion (UBAR, SystemIO, LURT (CONFIG_UART_FOR_CONSOLE), 6)
Field (UBAR, ByteAcc, NoLock, Preserve)
{
	TDR, 8,	/* Transmit Data Register IO Port + 0x0 */
	IER, 8,	/* Interrupt Enable Register IO Port + 0x1 */
	IIR, 8,	/* Interrupt Identification Register IO Port + 0x2 */
	LCR, 8,	/* Line Control Register IO Port + 0x3 */
	MCR, 8,	/* Modem Control Register IO Port + 0x4 */
	LSR, 8	/* Line Status Register IO Port + 0x5 */
}
#endif

Method (APRT, 1, Serialized)
{
	Name(OPDT, 0)
	Name(INDX, 0)
	Name(LENG, 0)
	Name(ADBG, Buffer(256) {0})

	If (ObjectType(Arg0) == 1) { /* Integer */
		ToHexString(Arg0, Local0)
		ADBG = Local0
	} ElseIf (ObjectType(Arg0) == 2) { /* String */
		ADBG = Arg0
	} ElseIf (ObjectType(Arg0) == 3) { /* Buffer */
		ToHexString(Arg0, ADBG)
	} Else {
		ADBG = "This type of object is not supported"
	}

	While (DeRefOf(ADBG[INDX]) != 0)
	{
		INDX++
	}
	LENG = INDX /* Length of the String */

	If (UFLG == 0) {
		/* Enable Baud Rate Divisor Latch, Set Word length to 8 bit*/
		LCR = 0x83
		IIR = 0x01
		MCR = 0x03

		/* Configure baud rate to 115200 */
		TDR = 0x01
		IER = 0x00
		LCR = 0x03 /* Disable Baud Rate Divisor Latch */

		UFLG++
	}
	INDX = 0x00
	While (INDX < LENG)
	{
		/* Wait for the transmitter t to be ready */
		While (1)
		{
			OPDT = LSR & 0x20
			If (OPDT != 0)
			{
				Break
			}
		}
		TDR = DeRefOf (ADBG[INDX])
		INDX++
	}
} /* End of APRT */

#endif