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

#include <acpi/acpigen.h>
#include <console/console.h>
#include <soc/gpio.h>

static int acpigen_soc_gpio_op(const char *op, unsigned int gpio_num)
{
	if (gpio_num >= SOC_GPIO_TOTAL_PINS) {
		printk(BIOS_WARNING, "Warning: Pin %d should be smaller than"
					" %d\n", gpio_num, SOC_GPIO_TOTAL_PINS);
		return -1;
	}
	if (SOC_GPIO_TOTAL_PINS >= AMD_GPIO_FIRST_REMOTE_GPIO_NUMBER &&
			gpio_num >= SOC_GPIO_TOTAL_PINS) {
		printk(BIOS_WARNING, "Warning: Pin %d is a remote GPIO which isn't supported"
			" yet.\n", gpio_num);
		return -1;
	}
	/* op (gpio_num) */
	acpigen_emit_namestring(op);
	acpigen_write_integer(gpio_num);
	return 0;
}

static int acpigen_soc_get_gpio_state(const char *op, unsigned int gpio_num)
{
	if (gpio_num >= SOC_GPIO_TOTAL_PINS) {
		printk(BIOS_WARNING, "Warning: Pin %d should be smaller than"
					" %d\n", gpio_num, SOC_GPIO_TOTAL_PINS);
		return -1;
	}
	if (SOC_GPIO_TOTAL_PINS >= AMD_GPIO_FIRST_REMOTE_GPIO_NUMBER &&
			gpio_num >= SOC_GPIO_TOTAL_PINS) {
		printk(BIOS_WARNING, "Warning: Pin %d is a remote GPIO which isn't supported"
			" yet.\n", gpio_num);
		return -1;
	}
	/* Store (op (gpio_num), Local0) */
	acpigen_write_store();
	acpigen_soc_gpio_op(op, gpio_num);
	acpigen_emit_byte(LOCAL0_OP);
	return 0;
}

int acpigen_soc_read_rx_gpio(unsigned int gpio_num)
{
	return acpigen_soc_get_gpio_state("\\_SB.GRXS", gpio_num);
}

int acpigen_soc_get_tx_gpio(unsigned int gpio_num)
{
	return acpigen_soc_get_gpio_state("\\_SB.GTXS", gpio_num);
}

int acpigen_soc_set_tx_gpio(unsigned int gpio_num)
{
	return acpigen_soc_gpio_op("\\_SB.STXS", gpio_num);
}

int acpigen_soc_clear_tx_gpio(unsigned int gpio_num)
{
	return acpigen_soc_gpio_op("\\_SB.CTXS", gpio_num);
}
