platform/x86: x86-android-tablets: Fix the buttons on CZC P10T tablet
This switches the P10T tablet to "Android" mode, where the Home button sends a single sancode instead of a Windows-specific key combination and the other button doesn't disable the Wi-Fi. Signed-off-by: Lubomir Rintel <lkundrak@v3.sk> Link: https://lore.kernel.org/r/20220110063512.273252-1-lkundrak@v3.sk Reviewed-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
Родитель
442bf564eb
Коммит
5de2ffd5ac
|
@ -496,6 +496,39 @@ static const struct x86_dev_info chuwi_hi8_info __initconst = {
|
|||
.i2c_client_count = ARRAY_SIZE(chuwi_hi8_i2c_clients),
|
||||
};
|
||||
|
||||
#define CZC_EC_EXTRA_PORT 0x68
|
||||
#define CZC_EC_ANDROID_KEYS 0x63
|
||||
|
||||
static int __init czc_p10t_init(void)
|
||||
{
|
||||
/*
|
||||
* The device boots up in "Windows 7" mode, when the home button sends a
|
||||
* Windows specific key sequence (Left Meta + D) and the second button
|
||||
* sends an unknown one while also toggling the Radio Kill Switch.
|
||||
* This is a surprising behavior when the second button is labeled "Back".
|
||||
*
|
||||
* The vendor-supplied Android-x86 build switches the device to a "Android"
|
||||
* mode by writing value 0x63 to the I/O port 0x68. This just seems to just
|
||||
* set bit 6 on address 0x96 in the EC region; switching the bit directly
|
||||
* seems to achieve the same result. It uses a "p10t_switcher" to do the
|
||||
* job. It doesn't seem to be able to do anything else, and no other use
|
||||
* of the port 0x68 is known.
|
||||
*
|
||||
* In the Android mode, the home button sends just a single scancode,
|
||||
* which can be handled in Linux userspace more reasonably and the back
|
||||
* button only sends a scancode without toggling the kill switch.
|
||||
* The scancode can then be mapped either to Back or RF Kill functionality
|
||||
* in userspace, depending on how the button is labeled on that particular
|
||||
* model.
|
||||
*/
|
||||
outb(CZC_EC_ANDROID_KEYS, CZC_EC_EXTRA_PORT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct x86_dev_info czc_p10t __initconst = {
|
||||
.init = czc_p10t_init,
|
||||
};
|
||||
|
||||
/*
|
||||
* Whitelabel (sold as various brands) TM800A550L tablets.
|
||||
* These tablet's DSDT contains a whole bunch of bogus ACPI I2C devices
|
||||
|
@ -647,6 +680,24 @@ static const struct dmi_system_id x86_android_tablet_ids[] __initconst = {
|
|||
},
|
||||
.driver_data = (void *)&chuwi_hi8_info,
|
||||
},
|
||||
{
|
||||
/* CZC P10T */
|
||||
.ident = "CZC ODEON TPC-10 (\"P10T\")",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "CZC"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ODEON*TPC-10"),
|
||||
},
|
||||
.driver_data = (void *)&czc_p10t,
|
||||
},
|
||||
{
|
||||
/* A variant of CZC P10T */
|
||||
.ident = "ViewSonic ViewPad 10",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ViewSonic"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "VPAD10"),
|
||||
},
|
||||
.driver_data = (void *)&czc_p10t,
|
||||
},
|
||||
{
|
||||
/* Whitelabel (sold as various brands) TM800A550L */
|
||||
.matches = {
|
||||
|
|
Загрузка…
Ссылка в новой задаче