blob: b5167b87436a7df9194e37a3f2997c91f2662b94 [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) {
10 printk(BIOS_WARNING, "Warning: Pin %d should be smaller than"
11 " %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) {
16 printk(BIOS_WARNING, "Warning: Pin %d is a remote GPIO which isn't supported"
17 " 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) {
29 printk(BIOS_WARNING, "Warning: Pin %d should be smaller than"
30 " %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) {
35 printk(BIOS_WARNING, "Warning: Pin %d is a remote GPIO which isn't supported"
36 " 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}