blob: c4e380154563cc53c654cf6268a5f7647434c805 [file] [log] [blame]
Eric Lai65b0afe2021-04-09 11:50:48 +08001/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <acpi/acpigen.h>
4#include <console/console.h>
5#include <soc/gpio.h>
6
7static int acpigen_soc_gpio_op(const char *op, unsigned int gpio_num)
8{
9 if (gpio_num >= SOC_GPIO_TOTAL_PINS) {
Julius Wernere9665952022-01-21 17:06:20 -080010 printk(BIOS_WARNING, "Pin %d should be smaller than"
Eric Lai65b0afe2021-04-09 11:50:48 +080011 " %d\n", gpio_num, SOC_GPIO_TOTAL_PINS);
12 return -1;
13 }
Felix Held71102352021-08-04 23:47:50 +020014 if (SOC_GPIO_TOTAL_PINS >= AMD_GPIO_FIRST_REMOTE_GPIO_NUMBER &&
15 gpio_num >= SOC_GPIO_TOTAL_PINS) {
Julius Wernere9665952022-01-21 17:06:20 -080016 printk(BIOS_WARNING, "Pin %d is a remote GPIO which isn't supported"
Felix Held71102352021-08-04 23:47:50 +020017 " yet.\n", gpio_num);
18 return -1;
19 }
Eric Lai65b0afe2021-04-09 11:50:48 +080020 /* op (gpio_num) */
21 acpigen_emit_namestring(op);
22 acpigen_write_integer(gpio_num);
23 return 0;
24}
25
26static int acpigen_soc_get_gpio_state(const char *op, unsigned int gpio_num)
27{
28 if (gpio_num >= SOC_GPIO_TOTAL_PINS) {
Julius Wernere9665952022-01-21 17:06:20 -080029 printk(BIOS_WARNING, "Pin %d should be smaller than"
Eric Lai65b0afe2021-04-09 11:50:48 +080030 " %d\n", gpio_num, SOC_GPIO_TOTAL_PINS);
31 return -1;
32 }
Felix Held71102352021-08-04 23:47:50 +020033 if (SOC_GPIO_TOTAL_PINS >= AMD_GPIO_FIRST_REMOTE_GPIO_NUMBER &&
34 gpio_num >= SOC_GPIO_TOTAL_PINS) {
Julius Wernere9665952022-01-21 17:06:20 -080035 printk(BIOS_WARNING, "Pin %d is a remote GPIO which isn't supported"
Felix Held71102352021-08-04 23:47:50 +020036 " yet.\n", gpio_num);
37 return -1;
38 }
Eric Lai65b0afe2021-04-09 11:50:48 +080039 /* Store (op (gpio_num), Local0) */
40 acpigen_write_store();
41 acpigen_soc_gpio_op(op, gpio_num);
42 acpigen_emit_byte(LOCAL0_OP);
43 return 0;
44}
45
46int acpigen_soc_read_rx_gpio(unsigned int gpio_num)
47{
48 return acpigen_soc_get_gpio_state("\\_SB.GRXS", gpio_num);
49}
50
51int acpigen_soc_get_tx_gpio(unsigned int gpio_num)
52{
53 return acpigen_soc_get_gpio_state("\\_SB.GTXS", gpio_num);
54}
55
56int acpigen_soc_set_tx_gpio(unsigned int gpio_num)
57{
58 return acpigen_soc_gpio_op("\\_SB.STXS", gpio_num);
59}
60
61int acpigen_soc_clear_tx_gpio(unsigned int gpio_num)
62{
63 return acpigen_soc_gpio_op("\\_SB.CTXS", gpio_num);
64}