Hi, On 9/11/22 20:49, Arvid Norlander wrote: > The Z830 has some buttons that will only work properly as "quickstart" > buttons. To enable them in that mode, a value between 1 and 7 must be > used for HCI_HOTKEY_EVENT. Windows uses 0x5 on this laptop so use that for > maximum predictability and compatibility. > > As there is not yet a known way of auto detection, this patch uses a DMI > quirk table. A module parameter is exposed to allow setting this on other > models for testing. > > Signed-off-by: Arvid Norlander <lkml@xxxxxxxxx> Instead if adding a second dmi_system_id table please convert the existing one into a generic quirk table. The idea is to make it look something like this: #define QUIRK_TURN_ON_PANEL_ON_RESUME BIT(0) #define QUIRK_HCI_HOTKEY_QUICKSTART BIT(1) static const struct dmi_system_id toshiba_dmi_quirks[] = { { /* Toshiba Portégé R700 */ /* https://bugzilla.kernel.org/show_bug.cgi?id=21012 */ .matches = { DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R700"), }, .driver_data = (void *)QUIRK_TURN_ON_PANEL_ON_RESUME, }, { /* Toshiba Satellite/Portégé R830 */ /* Portégé: https://bugs.freedesktop.org/show_bug.cgi?id=82634 */ /* Satellite: https://bugzilla.kernel.org/show_bug.cgi?id=21012 */ .matches = { DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), DMI_MATCH(DMI_PRODUCT_NAME, "R830"), }, .driver_data = (void *)QUIRK_TURN_ON_PANEL_ON_RESUME, }, { /* Toshiba Satellite/Portégé Z830 */ .matches = { DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), DMI_MATCH(DMI_PRODUCT_NAME, "Z830"), }, .driver_data = (void *)QUIRK_TURN_ON_PANEL_ON_RESUME | QUIRK_HCI_HOTKEY_QUICKSTART, }, }; And then in toshiba_acpi_add() use: const struct dmi_system_id *dmi_id; long quirks = 0; dmi_id = dmi_first_match(toshiba_dmi_quirks); if (dmi_id) quirks = (long)dmi_id->driver_data; if (turn_on_panel_on_resume == -1) turn_on_panel_on_resume = !!(quirks & QUIRK_TURN_ON_PANEL_ON_RESUME); if (hci_hotkey_quickstart == -1) hci_hotkey_quickstart = !!(quirks & QUIRK_HCI_HOTKEY_QUICKSTART); This avoids duplicating the DMI match for the Z830 models and will also make it easier to add more DMI based quirks in the future. Regards, Hans > --- > drivers/platform/x86/toshiba_acpi.c | 31 ++++++++++++++++++++++++++++- > 1 file changed, 30 insertions(+), 1 deletion(-) > > diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c > index 9f1394b73895..dce1f5049bf8 100644 > --- a/drivers/platform/x86/toshiba_acpi.c > +++ b/drivers/platform/x86/toshiba_acpi.c > @@ -58,6 +58,11 @@ module_param(turn_on_panel_on_resume, int, 0644); > MODULE_PARM_DESC(turn_on_panel_on_resume, > "Call HCI_PANEL_POWER_ON on resume (-1 = auto, 0 = no, 1 = yes"); > > +static int hci_hotkey_quickstart = -1; > +module_param(hci_hotkey_quickstart, int, 0644); > +MODULE_PARM_DESC(hci_hotkey_quickstart, > + "Call HCI_HOTKEY_EVENT with value 0x5 for quickstart button support (-1 = auto, 0 = no, 1 = yes"); > + > #define TOSHIBA_WMI_EVENT_GUID "59142400-C6A3-40FA-BADB-8A2652834100" > > /* Scan code for Fn key on TOS1900 models */ > @@ -137,6 +142,7 @@ MODULE_PARM_DESC(turn_on_panel_on_resume, > #define HCI_ACCEL_MASK 0x7fff > #define HCI_ACCEL_DIRECTION_MASK 0x8000 > #define HCI_HOTKEY_DISABLE 0x0b > +#define HCI_HOTKEY_ENABLE_QUICKSTART 0x05 > #define HCI_HOTKEY_ENABLE 0x09 > #define HCI_HOTKEY_SPECIAL_FUNCTIONS 0x10 > #define HCI_LCD_BRIGHTNESS_BITS 3 > @@ -2731,10 +2737,15 @@ static int toshiba_acpi_enable_hotkeys(struct toshiba_acpi_dev *dev) > return -ENODEV; > > /* > + * Enable quickstart buttons if supported. > + * > * Enable the "Special Functions" mode only if they are > * supported and if they are activated. > */ > - if (dev->kbd_function_keys_supported && dev->special_functions) > + if (hci_hotkey_quickstart) > + result = hci_write(dev, HCI_HOTKEY_EVENT, > + HCI_HOTKEY_ENABLE_QUICKSTART); > + else if (dev->kbd_function_keys_supported && dev->special_functions) > result = hci_write(dev, HCI_HOTKEY_EVENT, > HCI_HOTKEY_SPECIAL_FUNCTIONS); > else > @@ -3287,6 +3298,21 @@ static const struct dmi_system_id turn_on_panel_on_resume_dmi_ids[] = { > }, > }; > > +/* > + * Some Toshibas use "quickstart" keys. On these, HCI_HOTKEY_EVENT must use > + * the value HCI_HOTKEY_ENABLE_QUICKSTART. > + */ > +static const struct dmi_system_id hci_hotkey_quickstart_dmi_ids[] = { > + { > + /* Toshiba Satellite/Portégé Z830 */ > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), > + DMI_MATCH(DMI_PRODUCT_NAME, "Z830"), > + }, > + }, > +}; > + > + > static int toshiba_acpi_add(struct acpi_device *acpi_dev) > { > struct toshiba_acpi_dev *dev; > @@ -3447,6 +3473,9 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev) > if (turn_on_panel_on_resume == -1) > turn_on_panel_on_resume = dmi_check_system(turn_on_panel_on_resume_dmi_ids); > > + if (hci_hotkey_quickstart == -1) > + hci_hotkey_quickstart = dmi_check_system(hci_hotkey_quickstart_dmi_ids); > + > toshiba_wwan_available(dev); > if (dev->wwan_supported) > toshiba_acpi_setup_wwan_rfkill(dev);