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
19struct gpio_desc;
20struct gpiod_lookup_table;
21struct platform_device_info;
22struct 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 */
28enum 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
35struct 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 */
47struct 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
53struct 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
59struct 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
72struct x86_gpio_button {
73 struct gpio_keys_button button;
74 const char *chip;
75 int pin;
76};
77
78struct 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
96int 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);
99int 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 */
105extern const struct x86_dev_info acer_b1_750_info;
106extern const struct x86_dev_info advantech_mica_071_info;
107extern const struct x86_dev_info asus_me176c_info;
108extern const struct x86_dev_info asus_tf103c_info;
109extern const struct x86_dev_info chuwi_hi8_info;
110extern const struct x86_dev_info cyberbook_t116_info;
111extern const struct x86_dev_info czc_p10t;
112extern const struct x86_dev_info lenovo_yogabook_x90_info;
113extern const struct x86_dev_info lenovo_yogabook_x91_info;
114extern const struct x86_dev_info lenovo_yoga_tab2_830_1050_info;
115extern const struct x86_dev_info lenovo_yt3_info;
116extern const struct x86_dev_info medion_lifetab_s10346_info;
117extern const struct x86_dev_info nextbook_ares8_info;
118extern const struct x86_dev_info nextbook_ares8a_info;
119extern const struct x86_dev_info peaq_c1010_info;
120extern const struct x86_dev_info whitelabel_tm800a550l_info;
121extern const struct x86_dev_info xiaomi_mipad2_info;
122extern const struct dmi_system_id x86_android_tablet_ids[];
123
124#endif
125

source code of linux/drivers/platform/x86/x86-android-tablets/x86-android-tablets.h