1 | /* SPDX-License-Identifier: GPL-2.0-or-later |
2 | * |
3 | * DMI based code to deal with broken DSDTs on X86 tablets which ship with |
4 | * Android as (part of) the factory image. The factory kernels shipped on these |
5 | * devices typically have a bunch of things hardcoded, rather than specified |
6 | * in their DSDT. |
7 | * |
8 | * Copyright (C) 2021-2023 Hans de Goede <hdegoede@redhat.com> |
9 | */ |
10 | #ifndef __PDX86_X86_ANDROID_TABLETS_H |
11 | #define __PDX86_X86_ANDROID_TABLETS_H |
12 | |
13 | #include <linux/gpio/consumer.h> |
14 | #include <linux/gpio_keys.h> |
15 | #include <linux/i2c.h> |
16 | #include <linux/irqdomain_defs.h> |
17 | #include <linux/spi/spi.h> |
18 | |
19 | struct gpio_desc; |
20 | struct gpiod_lookup_table; |
21 | struct platform_device_info; |
22 | struct software_node; |
23 | |
24 | /* |
25 | * Helpers to get Linux IRQ numbers given a description of the IRQ source |
26 | * (either IOAPIC index, or GPIO chip name + pin-number). |
27 | */ |
28 | enum x86_acpi_irq_type { |
29 | X86_ACPI_IRQ_TYPE_NONE, |
30 | X86_ACPI_IRQ_TYPE_APIC, |
31 | X86_ACPI_IRQ_TYPE_GPIOINT, |
32 | X86_ACPI_IRQ_TYPE_PMIC, |
33 | }; |
34 | |
35 | struct x86_acpi_irq_data { |
36 | char *chip; /* GPIO chip label (GPIOINT) or PMIC ACPI path (PMIC) */ |
37 | enum x86_acpi_irq_type type; |
38 | enum irq_domain_bus_token domain; |
39 | int index; |
40 | int trigger; /* ACPI_EDGE_SENSITIVE / ACPI_LEVEL_SENSITIVE */ |
41 | int polarity; /* ACPI_ACTIVE_HIGH / ACPI_ACTIVE_LOW / ACPI_ACTIVE_BOTH */ |
42 | bool free_gpio; /* Release GPIO after getting IRQ (for TYPE_GPIOINT) */ |
43 | const char *con_id; |
44 | }; |
45 | |
46 | /* Structs to describe devices to instantiate */ |
47 | struct x86_i2c_client_info { |
48 | struct i2c_board_info board_info; |
49 | char *adapter_path; |
50 | struct x86_acpi_irq_data irq_data; |
51 | }; |
52 | |
53 | struct x86_spi_dev_info { |
54 | struct spi_board_info board_info; |
55 | char *ctrl_path; |
56 | struct x86_acpi_irq_data irq_data; |
57 | }; |
58 | |
59 | struct x86_serdev_info { |
60 | const char *ctrl_hid; |
61 | const char *ctrl_uid; |
62 | const char *ctrl_devname; |
63 | /* |
64 | * ATM the serdev core only supports of or ACPI matching; and sofar all |
65 | * Android x86 tablets DSDTs have usable serdev nodes, but sometimes |
66 | * under the wrong controller. So we just tie the existing serdev ACPI |
67 | * node to the right controller. |
68 | */ |
69 | const char *serdev_hid; |
70 | }; |
71 | |
72 | struct x86_gpio_button { |
73 | struct gpio_keys_button button; |
74 | const char *chip; |
75 | int pin; |
76 | }; |
77 | |
78 | struct x86_dev_info { |
79 | const char * const *modules; |
80 | const struct software_node *bat_swnode; |
81 | struct gpiod_lookup_table * const *gpiod_lookup_tables; |
82 | const struct x86_i2c_client_info *i2c_client_info; |
83 | const struct x86_spi_dev_info *spi_dev_info; |
84 | const struct platform_device_info *pdev_info; |
85 | const struct x86_serdev_info *serdev_info; |
86 | const struct x86_gpio_button *gpio_button; |
87 | int i2c_client_count; |
88 | int spi_dev_count; |
89 | int pdev_count; |
90 | int serdev_count; |
91 | int gpio_button_count; |
92 | int (*init)(void); |
93 | void (*exit)(void); |
94 | }; |
95 | |
96 | int x86_android_tablet_get_gpiod(const char *chip, int pin, const char *con_id, |
97 | bool active_low, enum gpiod_flags dflags, |
98 | struct gpio_desc **desc); |
99 | int x86_acpi_irq_helper_get(const struct x86_acpi_irq_data *data); |
100 | |
101 | /* |
102 | * Extern declarations of x86_dev_info structs so there can be a single |
103 | * MODULE_DEVICE_TABLE(dmi, ...), while splitting the board descriptions. |
104 | */ |
105 | extern const struct x86_dev_info acer_b1_750_info; |
106 | extern const struct x86_dev_info advantech_mica_071_info; |
107 | extern const struct x86_dev_info asus_me176c_info; |
108 | extern const struct x86_dev_info asus_tf103c_info; |
109 | extern const struct x86_dev_info chuwi_hi8_info; |
110 | extern const struct x86_dev_info cyberbook_t116_info; |
111 | extern const struct x86_dev_info czc_p10t; |
112 | extern const struct x86_dev_info lenovo_yogabook_x90_info; |
113 | extern const struct x86_dev_info lenovo_yogabook_x91_info; |
114 | extern const struct x86_dev_info lenovo_yoga_tab2_830_1050_info; |
115 | extern const struct x86_dev_info lenovo_yt3_info; |
116 | extern const struct x86_dev_info medion_lifetab_s10346_info; |
117 | extern const struct x86_dev_info nextbook_ares8_info; |
118 | extern const struct x86_dev_info nextbook_ares8a_info; |
119 | extern const struct x86_dev_info peaq_c1010_info; |
120 | extern const struct x86_dev_info whitelabel_tm800a550l_info; |
121 | extern const struct x86_dev_info xiaomi_mipad2_info; |
122 | extern const struct dmi_system_id x86_android_tablet_ids[]; |
123 | |
124 | #endif |
125 | |