From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933737AbcHaIwX (ORCPT ); Wed, 31 Aug 2016 04:52:23 -0400 Received: from mail-it0-f49.google.com ([209.85.214.49]:36789 "EHLO mail-it0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759539AbcHaIwV (ORCPT ); Wed, 31 Aug 2016 04:52:21 -0400 MIME-Version: 1.0 In-Reply-To: <1472630482.2273.4.camel@intel.com> References: <1472628817-3145-1-git-send-email-wnhuang@google.com> <1472630482.2273.4.camel@intel.com> From: Wei-Ning Huang Date: Wed, 31 Aug 2016 16:52:19 +0800 Message-ID: Subject: Re: [PATCH] ACPI / button: add support for tablet mode switch To: Zhang Rui Cc: "Rafael J . Wysocki" , Len Brown , linux-acpi@vger.kernel.org, LKML Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by mail.home.local id u7V8qR4e002927 On Wed, Aug 31, 2016 at 4:01 PM, Zhang Rui wrote: > On 三, 2016-08-31 at 15:33 +0800, Wei-Ning Huang wrote: >> From: Wei-Ning Huang >> >> ACPI PNP device HID 'PNP0C60' is a device that indicates tablet mode >> status. Add support for mapping this device to the SW_TABLET_MODE >> input >> event. >> >> Signed-off-by: Wei-Ning Huang >> --- >> drivers/acpi/button.c | 36 ++++++++++++++++++++++++++++++++++++ >> 1 file changed, 36 insertions(+) >> >> diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c >> index 148f4e5..50e9de6 100644 >> --- a/drivers/acpi/button.c >> +++ b/drivers/acpi/button.c >> @@ -53,6 +53,11 @@ >> #define ACPI_BUTTON_DEVICE_NAME_LID "Lid Switch" >> #define ACPI_BUTTON_TYPE_LID 0x05 >> >> +#define ACPI_BUTTON_SUBCLASS_TABLET "tablet" >> +#define ACPI_BUTTON_HID_TABLET "PNP0C60" >> +#define ACPI_BUTTON_DEVICE_NAME_TABLET "Tablet Mode Switch" >> +#define ACPI_BUTTON_TYPE_TABLET 0x07 >> + >> #define ACPI_BUTTON_LID_INIT_IGNORE 0x00 >> #define ACPI_BUTTON_LID_INIT_OPEN 0x01 >> #define ACPI_BUTTON_LID_INIT_METHOD 0x02 >> @@ -70,6 +75,7 @@ static const struct acpi_device_id >> button_device_ids[] = { >> {ACPI_BUTTON_HID_SLEEPF, 0}, >> {ACPI_BUTTON_HID_POWER, 0}, >> {ACPI_BUTTON_HID_POWERF, 0}, >> + {ACPI_BUTTON_HID_TABLET, 0}, >> {"", 0}, >> }; >> MODULE_DEVICE_TABLE(acpi, button_device_ids); >> @@ -305,6 +311,23 @@ static void acpi_lid_initialize_state(struct >> acpi_device *device) >> } >> } >> >> +static int acpi_tablet_send_state(struct acpi_device *device) >> +{ >> + struct acpi_button *button = acpi_driver_data(device); >> + unsigned long long state; >> + acpi_status status; >> + >> + status = acpi_evaluate_integer(device->handle, "_TBL", NULL, >> &state); > > Control methods with prefix "_" suggests this is an ACPI predefined > control method, but I can not find it in ACPI spec 6.1. > Can you illustrate me where I can find the definition of _TBL? Sorry, I'm not very familiar with ACPI's control method. '_TBL' is not a predefined ACPI control method according to the ACPI 6.1 spec. Maybe I should change it to '_LID'? As a tablet switch is sort of a 'inverted' lid switch. Wei-Ning > > thanks, > rui >> + if (ACPI_FAILURE(status)) >> + return -ENODEV; >> + >> + /* input layer checks if event is redundant */ >> + input_report_switch(button->input, SW_TABLET_MODE, state); >> + input_sync(button->input); >> + >> + return 0; >> +} >> + >> static void acpi_button_notify(struct acpi_device *device, u32 >> event) >> { >> struct acpi_button *button = acpi_driver_data(device); >> @@ -318,6 +341,8 @@ static void acpi_button_notify(struct acpi_device >> *device, u32 event) >> input = button->input; >> if (button->type == ACPI_BUTTON_TYPE_LID) { >> acpi_lid_update_state(device); >> + } else if (button->type == ACPI_BUTTON_TYPE_TABLET) >> { >> + acpi_tablet_send_state(device); >> } else { >> int keycode; >> >> @@ -407,6 +432,11 @@ static int acpi_button_add(struct acpi_device >> *device) >> strcpy(name, ACPI_BUTTON_DEVICE_NAME_LID); >> sprintf(class, "%s/%s", >> ACPI_BUTTON_CLASS, >> ACPI_BUTTON_SUBCLASS_LID); >> + } else if (!strcmp(hid, ACPI_BUTTON_HID_TABLET)) { >> + button->type = ACPI_BUTTON_TYPE_TABLET; >> + strcpy(name, ACPI_BUTTON_DEVICE_NAME_TABLET); >> + sprintf(class, "%s/%s", >> + ACPI_BUTTON_CLASS, >> ACPI_BUTTON_SUBCLASS_TABLET); >> } else { >> printk(KERN_ERR PREFIX "Unsupported hid [%s]\n", >> hid); >> error = -ENODEV; >> @@ -437,6 +467,10 @@ static int acpi_button_add(struct acpi_device >> *device) >> case ACPI_BUTTON_TYPE_LID: >> input_set_capability(input, EV_SW, SW_LID); >> break; >> + >> + case ACPI_BUTTON_TYPE_TABLET: >> + input_set_capability(input, EV_SW, SW_TABLET_MODE); >> + break; >> } >> >> error = input_register_device(input); >> @@ -450,6 +484,8 @@ static int acpi_button_add(struct acpi_device >> *device) >> */ >> lid_device = device; >> } >> + if (button->type == ACPI_BUTTON_TYPE_TABLET) >> + acpi_tablet_send_state(device); >> >> printk(KERN_INFO PREFIX "%s [%s]\n", name, >> acpi_device_bid(device)); >> return 0; -- Wei-Ning Huang, 黃偉寧 | Software Engineer, Google Inc., Taiwan | wnhuang@google.com | Cell: +886 910-380678