Commit | Line | Data |
---|---|---|
62a5f689 HG |
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 | ||
4014ae23 | 13 | #include <linux/gpio/consumer.h> |
e2200d3f | 14 | #include <linux/gpio_keys.h> |
62a5f689 HG |
15 | #include <linux/i2c.h> |
16 | #include <linux/irqdomain_defs.h> | |
70505ea6 | 17 | #include <linux/spi/spi.h> |
62a5f689 HG |
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 */ | |
bd8905d7 | 42 | bool free_gpio; /* Release GPIO after getting IRQ (for TYPE_GPIOINT) */ |
4014ae23 | 43 | const char *con_id; |
62a5f689 HG |
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 | ||
70505ea6 HG |
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 | ||
62a5f689 HG |
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 | ||
e2200d3f HG |
72 | struct x86_gpio_button { |
73 | struct gpio_keys_button button; | |
74 | const char *chip; | |
75 | int pin; | |
76 | }; | |
77 | ||
62a5f689 | 78 | struct x86_dev_info { |
62a5f689 HG |
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; | |
70505ea6 | 83 | const struct x86_spi_dev_info *spi_dev_info; |
62a5f689 HG |
84 | const struct platform_device_info *pdev_info; |
85 | const struct x86_serdev_info *serdev_info; | |
6dc6c0c1 | 86 | const struct x86_gpio_button *gpio_button; |
62a5f689 | 87 | int i2c_client_count; |
70505ea6 | 88 | int spi_dev_count; |
62a5f689 HG |
89 | int pdev_count; |
90 | int serdev_count; | |
6dc6c0c1 | 91 | int gpio_button_count; |
492b1194 | 92 | int (*init)(struct device *dev); |
62a5f689 HG |
93 | void (*exit)(void); |
94 | }; | |
95 | ||
4014ae23 HG |
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); | |
62a5f689 HG |
99 | int x86_acpi_irq_helper_get(const struct x86_acpi_irq_data *data); |
100 | ||
3a75d169 HG |
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; | |
24f7b9a0 | 110 | extern const struct x86_dev_info cyberbook_t116_info; |
3a75d169 | 111 | extern const struct x86_dev_info czc_p10t; |
c69fec50 | 112 | extern const struct x86_dev_info lenovo_yogabook_x90_info; |
5f250f8a | 113 | extern const struct x86_dev_info lenovo_yogabook_x91_info; |
01862d01 | 114 | extern const struct x86_dev_info lenovo_yoga_tab2_830_1050_info; |
3eee73ad | 115 | extern const struct x86_dev_info lenovo_yoga_tab2_1380_info; |
3a75d169 HG |
116 | extern const struct x86_dev_info lenovo_yt3_info; |
117 | extern const struct x86_dev_info medion_lifetab_s10346_info; | |
118 | extern const struct x86_dev_info nextbook_ares8_info; | |
c9105066 | 119 | extern const struct x86_dev_info nextbook_ares8a_info; |
772cbba5 | 120 | extern const struct x86_dev_info peaq_c1010_info; |
3a75d169 HG |
121 | extern const struct x86_dev_info whitelabel_tm800a550l_info; |
122 | extern const struct x86_dev_info xiaomi_mipad2_info; | |
123 | extern const struct dmi_system_id x86_android_tablet_ids[]; | |
124 | ||
62a5f689 | 125 | #endif |