mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-03 08:14:12 +00:00
The Peaq C1010 tablet has a special "Dolby" button. This button has a WMI interface, but this is broken in several ways: 1. It only supports polling 2. The value read on polling goes from 0 -> 1 for one poll on both edges of the button, with no way to tell which edge causes the poll to return 1. 3. It uses a non unique GUID (it uses the Microsoft docs WMI example GUID). There currently is a WMI driver for this, but it uses several kludges to work around these issues and is not entirely reliable due to 2. Replace the unreliable WMI driver by using the x86-android-tablets code to instantiate a gpio_keys device for this. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Link: https://lore.kernel.org/r/20230301092331.7038-11-hdegoede@redhat.com
109 lines
3.4 KiB
C
109 lines
3.4 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
*
|
|
* DMI based code to deal with broken DSDTs on X86 tablets which ship with
|
|
* Android as (part of) the factory image. The factory kernels shipped on these
|
|
* devices typically have a bunch of things hardcoded, rather than specified
|
|
* in their DSDT.
|
|
*
|
|
* Copyright (C) 2021-2023 Hans de Goede <hdegoede@redhat.com>
|
|
*/
|
|
#ifndef __PDX86_X86_ANDROID_TABLETS_H
|
|
#define __PDX86_X86_ANDROID_TABLETS_H
|
|
|
|
#include <linux/gpio_keys.h>
|
|
#include <linux/i2c.h>
|
|
#include <linux/irqdomain_defs.h>
|
|
|
|
struct gpio_desc;
|
|
struct gpiod_lookup_table;
|
|
struct platform_device_info;
|
|
struct software_node;
|
|
|
|
/*
|
|
* Helpers to get Linux IRQ numbers given a description of the IRQ source
|
|
* (either IOAPIC index, or GPIO chip name + pin-number).
|
|
*/
|
|
enum x86_acpi_irq_type {
|
|
X86_ACPI_IRQ_TYPE_NONE,
|
|
X86_ACPI_IRQ_TYPE_APIC,
|
|
X86_ACPI_IRQ_TYPE_GPIOINT,
|
|
X86_ACPI_IRQ_TYPE_PMIC,
|
|
};
|
|
|
|
struct x86_acpi_irq_data {
|
|
char *chip; /* GPIO chip label (GPIOINT) or PMIC ACPI path (PMIC) */
|
|
enum x86_acpi_irq_type type;
|
|
enum irq_domain_bus_token domain;
|
|
int index;
|
|
int trigger; /* ACPI_EDGE_SENSITIVE / ACPI_LEVEL_SENSITIVE */
|
|
int polarity; /* ACPI_ACTIVE_HIGH / ACPI_ACTIVE_LOW / ACPI_ACTIVE_BOTH */
|
|
};
|
|
|
|
/* Structs to describe devices to instantiate */
|
|
struct x86_i2c_client_info {
|
|
struct i2c_board_info board_info;
|
|
char *adapter_path;
|
|
struct x86_acpi_irq_data irq_data;
|
|
};
|
|
|
|
struct x86_serdev_info {
|
|
const char *ctrl_hid;
|
|
const char *ctrl_uid;
|
|
const char *ctrl_devname;
|
|
/*
|
|
* ATM the serdev core only supports of or ACPI matching; and sofar all
|
|
* Android x86 tablets DSDTs have usable serdev nodes, but sometimes
|
|
* under the wrong controller. So we just tie the existing serdev ACPI
|
|
* node to the right controller.
|
|
*/
|
|
const char *serdev_hid;
|
|
};
|
|
|
|
struct x86_gpio_button {
|
|
struct gpio_keys_button button;
|
|
const char *chip;
|
|
int pin;
|
|
};
|
|
|
|
struct x86_dev_info {
|
|
char *invalid_aei_gpiochip;
|
|
const char * const *modules;
|
|
const struct software_node *bat_swnode;
|
|
struct gpiod_lookup_table * const *gpiod_lookup_tables;
|
|
const struct x86_i2c_client_info *i2c_client_info;
|
|
const struct platform_device_info *pdev_info;
|
|
const struct x86_serdev_info *serdev_info;
|
|
struct x86_gpio_button *gpio_button;
|
|
int i2c_client_count;
|
|
int pdev_count;
|
|
int serdev_count;
|
|
int (*init)(void);
|
|
void (*exit)(void);
|
|
};
|
|
|
|
int x86_android_tablet_get_gpiod(const char *label, int pin, struct gpio_desc **desc);
|
|
int x86_acpi_irq_helper_get(const struct x86_acpi_irq_data *data);
|
|
|
|
/*
|
|
* Extern declarations of x86_dev_info structs so there can be a single
|
|
* MODULE_DEVICE_TABLE(dmi, ...), while splitting the board descriptions.
|
|
*/
|
|
extern const struct x86_dev_info acer_b1_750_info;
|
|
extern const struct x86_dev_info advantech_mica_071_info;
|
|
extern const struct x86_dev_info asus_me176c_info;
|
|
extern const struct x86_dev_info asus_tf103c_info;
|
|
extern const struct x86_dev_info chuwi_hi8_info;
|
|
extern const struct x86_dev_info czc_p10t;
|
|
extern const struct x86_dev_info lenovo_yogabook_x9x_info;
|
|
/* Not const as this gets modified by its init callback */
|
|
extern struct x86_dev_info lenovo_yoga_tab2_830_1050_info;
|
|
extern const struct x86_dev_info lenovo_yt3_info;
|
|
extern const struct x86_dev_info medion_lifetab_s10346_info;
|
|
extern const struct x86_dev_info nextbook_ares8_info;
|
|
extern const struct x86_dev_info peaq_c1010_info;
|
|
extern const struct x86_dev_info whitelabel_tm800a550l_info;
|
|
extern const struct x86_dev_info xiaomi_mipad2_info;
|
|
extern const struct dmi_system_id x86_android_tablet_ids[];
|
|
|
|
#endif
|