1 /* SPDX-License-Identifier: GPL-2.0-or-later
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
8 * Copyright (C) 2021-2023 Hans de Goede <hdegoede@redhat.com>
10 #ifndef __PDX86_X86_ANDROID_TABLETS_H
11 #define __PDX86_X86_ANDROID_TABLETS_H
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>
20 struct gpiod_lookup_table
;
21 struct platform_device_info
;
25 * Helpers to get Linux IRQ numbers given a description of the IRQ source
26 * (either IOAPIC index, or GPIO chip name + pin-number).
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
,
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
;
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) */
46 /* Structs to describe devices to instantiate */
47 struct x86_i2c_client_info
{
48 struct i2c_board_info board_info
;
50 struct x86_acpi_irq_data irq_data
;
53 struct x86_spi_dev_info
{
54 struct spi_board_info board_info
;
56 struct x86_acpi_irq_data irq_data
;
59 struct x86_serdev_info
{
62 const char *ctrl_devname
;
64 * ATM the serdev core only supports of or ACPI matching; and so far 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.
69 const char *serdev_hid
;
72 struct x86_gpio_button
{
73 struct gpio_keys_button button
;
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
;
91 int gpio_button_count
;
92 int (*init
)(struct device
*dev
);
97 int x86_android_tablet_get_gpiod(const char *chip
, int pin
, const char *con_id
,
98 bool active_low
, enum gpiod_flags dflags
,
99 struct gpio_desc
**desc
);
100 int x86_acpi_irq_helper_get(const struct x86_acpi_irq_data
*data
);
103 * Extern declarations of x86_dev_info structs so there can be a single
104 * MODULE_DEVICE_TABLE(dmi, ...), while splitting the board descriptions.
106 extern const struct x86_dev_info acer_b1_750_info
;
107 extern const struct x86_dev_info advantech_mica_071_info
;
108 extern const struct x86_dev_info asus_me176c_info
;
109 extern const struct x86_dev_info asus_tf103c_info
;
110 extern const struct x86_dev_info chuwi_hi8_info
;
111 extern const struct x86_dev_info cyberbook_t116_info
;
112 extern const struct x86_dev_info czc_p10t
;
113 extern const struct x86_dev_info lenovo_yogabook_x90_info
;
114 extern const struct x86_dev_info lenovo_yogabook_x91_info
;
115 extern const struct x86_dev_info lenovo_yoga_tab2_830_1050_info
;
116 extern const struct x86_dev_info lenovo_yoga_tab2_1380_info
;
117 extern const struct x86_dev_info lenovo_yt3_info
;
118 extern const struct x86_dev_info medion_lifetab_s10346_info
;
119 extern const struct x86_dev_info nextbook_ares8_info
;
120 extern const struct x86_dev_info nextbook_ares8a_info
;
121 extern const struct x86_dev_info peaq_c1010_info
;
122 extern const struct x86_dev_info whitelabel_tm800a550l_info
;
123 extern const struct x86_dev_info vexia_edu_atla10_info
;
124 extern const struct x86_dev_info xiaomi_mipad2_info
;
125 extern const struct dmi_system_id x86_android_tablet_ids
[];