On Friday 26 January 2018 12:21:28 Marco Martin wrote: > Some laptops such as Dell Inspiron 7000 series have the > tablet mode switch implemented in Intel ACPI, > the events to enter and exit the tablet mode are 0xCC and 0xCD > > CC: [email protected] > CC: Matthew Garrett <[email protected]> > CC: "Pali Rohár" <[email protected]> > CC: Darren Hart <[email protected]> > CC: Mario Limonciello <[email protected]> > CC: Andy Shevchenko <[email protected]> > > Signed-off-by: Marco Martin <[email protected]> > --- > drivers/platform/x86/intel-vbtn.c | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/drivers/platform/x86/intel-vbtn.c > b/drivers/platform/x86/intel-vbtn.c > index 58c5ff3..3765c41 100644 > --- a/drivers/platform/x86/intel-vbtn.c > +++ b/drivers/platform/x86/intel-vbtn.c > @@ -26,6 +26,9 @@ > #include <linux/suspend.h> > #include <acpi/acpi_bus.h> > > +/* When NOT in tablet mode, VGBS returns with the flag 0x40 */ > +#define TABLET_MODE_FLAG 0x40 > + > MODULE_LICENSE("GPL"); > MODULE_AUTHOR("AceLan Kao"); > > @@ -42,6 +45,8 @@ static const struct key_entry intel_vbtn_keymap[] = { > { KE_IGNORE, 0xC5, { KEY_VOLUMEUP } }, /* volume-up key > release */ > { KE_KEY, 0xC6, { KEY_VOLUMEDOWN } }, /* volume-down key > press */ > { KE_IGNORE, 0xC7, { KEY_VOLUMEDOWN } }, /* volume-down key > release */ > + { KE_SW, 0xCC, { .sw = { SW_TABLET_MODE, 1 } } }, /* Tablet mode in */ > + { KE_SW, 0xCD, { .sw = { SW_TABLET_MODE, 0 } } }, /* Tablet mode out */ > { KE_END }, > }; > > @@ -88,6 +93,7 @@ static void notify_handler(acpi_handle handle, u32 event, > void *context) > > static int intel_vbtn_probe(struct platform_device *device) > { > + struct acpi_buffer vgbs_output = { ACPI_ALLOCATE_BUFFER, NULL };
Memory leak. I do not see where is allocated buffer released.
> acpi_handle handle = ACPI_HANDLE(&device->dev);
> struct intel_vbtn_priv *priv;
> acpi_status status;
> @@ -110,6 +116,20 @@ static int intel_vbtn_probe(struct platform_device
> *device)
> return err;
> }
>
> + status = acpi_evaluate_object(handle, "VGBS", NULL, &vgbs_output);
> + /* VGBS being present and returning something means
> + * we have a tablet mode switch
> + */
> + if (ACPI_SUCCESS(status)) {
> + union acpi_object *obj = vgbs_output.pointer;
> +
> + if (obj && obj->type == ACPI_TYPE_INTEGER) {
> + input_report_switch(priv->input_dev,
> + SW_TABLET_MODE,
> +
> !(obj->integer.value & TABLET_MODE_FLAG));
> + }
> + }
> +
> status = acpi_install_notify_handler(handle,
> ACPI_DEVICE_NOTIFY,
> notify_handler,
> --
> 2.7.4
>
--
Pali Rohár
[email protected]
signature.asc
Description: PGP signature

