coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
gpio_keys.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <acpi/acpi_device.h>
4 #include <acpi/acpigen.h>
5 #include <device/device.h>
6 #include <device/path.h>
7 #include <string.h>
8 
9 #include "chip.h"
10 
13  const char *parent_path)
14 {
15  struct key_info *key = &config->key;
16  struct acpi_dp *dsd;
17 
18  if (!key->dev_name || !key->linux_code)
19  return NULL;
20 
21  dsd = acpi_dp_new_table(config->key.dev_name);
22 
23  acpi_dp_add_integer(dsd, "linux,code", key->linux_code);
24  if (key->linux_input_type)
25  acpi_dp_add_integer(dsd, "linux,input-type",
26  key->linux_input_type);
27  if (key->label)
28  acpi_dp_add_string(dsd, "label", key->label);
29 
30  if (key->wakeup_route == WAKEUP_ROUTE_SCI)
31  acpigen_write_PRW(key->wake_gpe, 3);
32 
33  if (key->wakeup_route != WAKEUP_ROUTE_DISABLED) {
34  acpi_dp_add_integer(dsd, "wakeup-source", 1);
35  acpi_dp_add_integer(dsd, "wakeup-event-action",
36  key->wakeup_event_action);
37  }
38 
39  if (key->can_be_disabled)
40  acpi_dp_add_integer(dsd, "linux,can-disable",
41  key->can_be_disabled);
42  if (key->debounce_interval)
43  acpi_dp_add_integer(dsd, "debounce-interval",
44  key->debounce_interval);
45  acpi_dp_add_gpio(dsd, "gpios", parent_path, 0, 0,
46  config->gpio.active_low);
47 
48  return dsd;
49 }
50 
51 static void gpio_keys_fill_ssdt_generator(const struct device *dev)
52 {
54  const char *scope = acpi_device_scope(dev);
55  const char *path = acpi_device_path(dev);
56  struct acpi_dp *dsd, *child;
57  const char *drv_string = config->is_polled ? "gpio-keys-polled"
58  : "gpio-keys";
59 
60  if (!scope || !path || !config->gpio.pin_count)
61  return;
62 
63  /* Device */
64  acpigen_write_scope(scope);
66 
67  /* _HID is set to PRP0001 */
69 
70  /* Resources - _CRS */
71  acpigen_write_name("_CRS");
75 
76  /* DSD */
77  dsd = acpi_dp_new_table("_DSD");
78  acpi_dp_add_string(dsd, "compatible", drv_string);
79  if (config->label)
80  acpi_dp_add_string(dsd, "label", config->label);
81  if (config->is_polled)
82  acpi_dp_add_integer(dsd, "poll-interval",
83  config->poll_interval);
84  /* Child device defining key */
86  if (child)
87  acpi_dp_add_child(dsd, "button-0", child);
88  acpi_dp_write(dsd);
89 
90  acpigen_pop_len(); /* Device */
91  acpigen_pop_len(); /* Scope */
92 }
93 
94 static const char *gpio_keys_acpi_name(const struct device *dev)
95 {
97  static char name[5];
98 
99  if (config->name)
100  return config->name;
101 
102  snprintf(name, sizeof(name), "K%03.3X", config->gpio.pins[0]);
103  name[4] = '\0';
104 
105  return name;
106 }
107 
108 static struct device_operations gpio_keys_ops = {
110  .set_resources = noop_set_resources,
111  .acpi_name = gpio_keys_acpi_name,
112  .acpi_fill_ssdt = gpio_keys_fill_ssdt_generator,
113 };
114 
115 static void gpio_keys_enable(struct device *dev)
116 {
117  dev->ops = &gpio_keys_ops;
118 }
119 
121  CHIP_NAME("GPIO Keys")
122  .enable_dev = gpio_keys_enable
123 };
struct acpi_dp * acpi_dp_add_child(struct acpi_dp *dp, const char *name, struct acpi_dp *child)
Definition: device.c:1019
void acpi_device_write_gpio(const struct acpi_gpio *gpio)
Definition: device.c:258
const char * acpi_device_path(const struct device *dev)
Definition: device.c:144
struct acpi_dp * acpi_dp_add_string(struct acpi_dp *dp, const char *name, const char *string)
Definition: device.c:991
struct acpi_dp * acpi_dp_add_integer(struct acpi_dp *dp, const char *name, uint64_t value)
Definition: device.c:977
void acpi_dp_write(struct acpi_dp *table)
Definition: device.c:898
struct acpi_dp * acpi_dp_add_gpio(struct acpi_dp *dp, const char *name, const char *ref, int index, int pin, int active_low)
Definition: device.c:1142
const char * acpi_device_name(const struct device *dev)
Definition: device.c:49
struct acpi_dp * acpi_dp_new_table(const char *name)
Definition: device.c:930
const char * acpi_device_scope(const struct device *dev)
Definition: device.c:158
#define ACPI_DT_NAMESPACE_HID
Definition: acpi_device.h:51
void acpigen_write_PRW(u32 wake, u32 level)
Definition: acpigen.c:929
void acpigen_pop_len(void)
Definition: acpigen.c:37
void acpigen_write_scope(const char *name)
Definition: acpigen.c:326
void acpigen_write_resourcetemplate_footer(void)
Definition: acpigen.c:1165
void acpigen_write_resourcetemplate_header(void)
Definition: acpigen.c:1147
void acpigen_write_device(const char *name)
Definition: acpigen.c:769
void acpigen_write_name(const char *name)
Definition: acpigen.c:320
void acpigen_write_name_string(const char *name, const char *string)
Definition: acpigen.c:176
const char * name
Definition: mmu.c:92
@ WAKEUP_ROUTE_DISABLED
Definition: chip.h:47
@ WAKEUP_ROUTE_SCI
Definition: chip.h:36
static const char * gpio_keys_acpi_name(const struct device *dev)
Definition: gpio_keys.c:94
static struct acpi_dp * gpio_keys_add_child_node(struct drivers_generic_gpio_keys_config *config, const char *parent_path)
Definition: gpio_keys.c:11
static void gpio_keys_enable(struct device *dev)
Definition: gpio_keys.c:115
struct chip_operations drivers_generic_gpio_keys_ops
Definition: gpio_keys.c:120
static struct device_operations gpio_keys_ops
Definition: gpio_keys.c:108
static void gpio_keys_fill_ssdt_generator(const struct device *dev)
Definition: gpio_keys.c:51
#define CHIP_NAME(X)
Definition: device.h:32
static void noop_read_resources(struct device *dev)
Standard device operations function pointers shims.
Definition: device.h:73
static void noop_set_resources(struct device *dev)
Definition: device.h:74
enum board_config config
Definition: memory.c:448
#define NULL
Definition: stddef.h:19
struct acpi_dp * child
Definition: acpi_device.h:27
void(* read_resources)(struct device *dev)
Definition: device.h:39
Definition: device.h:107
struct device_operations * ops
Definition: device.h:143
DEVTREE_CONST void * chip_info
Definition: device.h:164
Definition: chip.h:51
uint32_t linux_input_type
Definition: chip.h:60
uint32_t linux_code
Definition: chip.h:55
unsigned int wakeup_route
Definition: chip.h:64
const char * dev_name
Definition: chip.h:53
bool can_be_disabled
Definition: chip.h:70
const char * label
Definition: chip.h:62
uint32_t debounce_interval
Definition: chip.h:72
unsigned int wake_gpe
Definition: chip.h:66
unsigned int wakeup_event_action
Definition: chip.h:68
int snprintf(char *buf, size_t size, const char *fmt,...)
Note: This file is only for POSIX compatibility, and is meant to be chain-included via string....
Definition: vsprintf.c:35