All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mark Pearson <markpearson-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
To: markpearson-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org
Cc: ibm-acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
	ibm-acpi-N3TV7GIv+o9fyO9Q7EP/yw@public.gmane.org,
	Nitin Joshi <njoshi1-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>,
	platform-driver-x86-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: [PATCH] platform/x86: thinkpad_acpi: psensor interface
Date: Wed, 15 Jul 2020 19:52:42 -0400	[thread overview]
Message-ID: <20200715235242.4934-1-markpearson@lenovo.com> (raw)
In-Reply-To: <markpearson-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>

Some Lenovo Thinkpad platforms are equipped with a 'palm sensor' so as
to be able to determine if a user is physically proximate to the device.

This patch provides the ability to retrieve the psensor state via sysfs
entrypoints and will be used by userspace for WWAN functionality to
control the transmission level safely

Co-developed-by: Nitin Joshi <njoshi1-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Nitin Joshi <njoshi1-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Mark Pearson <markpearson-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
---
 .../admin-guide/laptops/thinkpad-acpi.rst     |  19 ++++
 drivers/platform/x86/thinkpad_acpi.c          | 104 +++++++++++++++++-
 2 files changed, 121 insertions(+), 2 deletions(-)

diff --git a/Documentation/admin-guide/laptops/thinkpad-acpi.rst b/Documentation/admin-guide/laptops/thinkpad-acpi.rst
index 99066aa8d97b..c2c238d5d5f6 100644
--- a/Documentation/admin-guide/laptops/thinkpad-acpi.rst
+++ b/Documentation/admin-guide/laptops/thinkpad-acpi.rst
@@ -51,6 +51,7 @@ detailed description):
 	- UWB enable and disable
 	- LCD Shadow (PrivacyGuard) enable and disable
 	- Lap mode sensor
+        - Palm sensor (aka p-sensor)
 
 A compatibility table by model and feature is maintained on the web
 site, http://ibm-acpi.sf.net/. I appreciate any success or failure
@@ -1447,6 +1448,24 @@ they differ between desk and lap mode.
 The property is read-only. If the platform doesn't have support the sysfs
 class is not created.
 
+Palm sensor
+------------------
+
+sysfs: psensor_state
+
+Certain thinkpads and mobile workstations are equipped with a palm sensor to
+detect when a user is physically near the device. This device, when present,
+is used in conjunction with the lapmode sensor to decide if WWAN transmission
+can be increased to maximum power.
+
+The property is read-only. If the platform doesn't have support the sysfs
+class is not created.
+
+Note - some platforms have a limitation whereby the EC firmware cannot
+determine if the sensor is not installed or not. On these platforms the
+p-sensor state will always be reported as true to avoid high power being used
+incorrectly.
+
 EXPERIMENTAL: UWB
 -----------------
 
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index 037eb77414f9..40f2e368fdf9 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -4071,8 +4071,8 @@ static bool hotkey_notify_6xxx(const u32 hkey,
 
 	case TP_HKEY_EV_PALM_DETECTED:
 	case TP_HKEY_EV_PALM_UNDETECTED:
-		/* palm detected hovering the keyboard, forward to user-space
-		 * via netlink for consumption */
+		/* palm detected - pass on to event handler */
+		tpacpi_driver_event(hkey);
 		return true;
 
 	default:
@@ -9894,6 +9894,99 @@ static struct ibm_struct dytc_driver_data = {
 	.exit = dytc_exit,
 };
 
+/*************************************************************************
+ * Palm sensor subdriver
+ */
+#define PSENSOR_PRESENT_BIT 0 /* Determine if psensor present */
+#define PSENSOR_ON_BIT      1 /* psensor status */
+
+static bool psensor_state;
+
+static void psensor_notify_change(void)
+{
+	sysfs_notify(&tpacpi_pdev->dev.kobj, NULL, "psensor_state");
+}
+
+static int psensor_get(bool *state)
+{
+	acpi_handle psensor_handle;
+	int output;
+
+	if (ACPI_FAILURE(acpi_get_handle(hkey_handle, "GPSS", &psensor_handle)))
+		return -ENODEV;
+
+	if (!acpi_evalf(psensor_handle, &output, NULL, "d"))
+		return -EIO;
+
+	/* Check if sensor has a Psensor */
+	if (!(output & BIT(PSENSOR_PRESENT_BIT)))
+		return -ENODEV;
+
+	/* Return if psensor is set or not */
+	*state = output & BIT(PSENSOR_ON_BIT) ? true : false;
+	return 0;
+}
+
+static void psensor_state_refresh(void)
+{
+	bool new_state;
+	int err;
+
+	err = psensor_get(&new_state);
+	if (err || (new_state == psensor_state))
+		return;
+
+	psensor_state = new_state;
+	psensor_notify_change();
+}
+
+/* sysfs psensor entry */
+static ssize_t psensor_state_show(struct device *dev,
+					struct device_attribute *attr,
+					char *buf)
+{
+	return snprintf(buf, PAGE_SIZE, "%d\n", psensor_state);
+}
+
+static DEVICE_ATTR_RO(psensor_state);
+
+static struct attribute *psensor_attributes[] = {
+	&dev_attr_psensor_state.attr,
+	NULL,
+};
+
+static const struct attribute_group psensor_attr_group = {
+	.attrs = psensor_attributes,
+};
+
+static int tpacpi_psensor_init(struct ibm_init_struct *iibm)
+{
+	int err;
+
+	err = psensor_get(&psensor_state);
+	/* If support isn't available (ENODEV) then don't return an error
+	 * but just don't create the sysfs group
+	 */
+	if (err == -ENODEV)
+		return 0;
+	/* For all other errors we can flag the failure */
+	if (err)
+		return err;
+
+	err = sysfs_create_group(&tpacpi_pdev->dev.kobj, &psensor_attr_group);
+	return err;
+}
+
+static void psensor_exit(void)
+{
+	sysfs_remove_group(&tpacpi_pdev->dev.kobj, &psensor_attr_group);
+}
+
+static struct ibm_struct psensor_driver_data = {
+	.name = "psensor",
+	.exit = psensor_exit,
+};
+
 /****************************************************************************
  ****************************************************************************
  *
@@ -9945,6 +10038,9 @@ static void tpacpi_driver_event(const unsigned int hkey_event)
 	if (hkey_event == TP_HKEY_EV_THM_CSM_COMPLETED)
 		dytc_lapmode_refresh();
 
+	if ((hkey_event == TP_HKEY_EV_PALM_DETECTED) ||
+		(hkey_event == TP_HKEY_EV_PALM_UNDETECTED))
+		psensor_state_refresh();
 }
 
 static void hotkey_driver_event(const unsigned int scancode)
@@ -10387,6 +10483,10 @@ static struct ibm_init_struct ibms_init[] __initdata = {
 		.init = tpacpi_dytc_init,
 		.data = &dytc_driver_data,
 	},
+	{
+		.init = tpacpi_psensor_init,
+		.data = &psensor_driver_data,
+	},
 };
 
 static int __init set_ibm_param(const char *val, const struct kernel_param *kp)
-- 
2.26.2

  parent reply	other threads:[~2020-07-15 23:52 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <markpearson@lenovo.com>
2020-06-02 22:56 ` [PATCH v2] platform/x86: thinkpad_acpi: lap or desk mode interface Mark Pearson
2020-06-17 18:09 ` [RESEND PATCH " Mark Pearson
     [not found]   ` <1905013469.24563660.1592574774373.JavaMail.zimbra@redhat.com>
     [not found]     ` <1905013469.24563660.1592574774373.JavaMail.zimbra-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2020-06-19 15:02       ` [External] " Mark Pearson
2020-06-24  2:08 ` [PATCH v3] " Mark Pearson
2020-06-29 19:17 ` [PATCH v4] " Mark Pearson
     [not found]   ` <20200629191748.3859-1-markpearson-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
2020-07-01  9:45     ` Bastien Nocera
     [not found]       ` <732277929.1313334.1593596757447.JavaMail.zimbra-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2020-07-27  2:51         ` [External] " Nitin Joshi1
     [not found]           ` <SG2PR03MB2718DFC08C4ECF7816D1B4E48C720-ePYYJTVkT3RfCKvAoM4nXq82SN/2zMuYvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2020-07-27 11:03             ` Bastien Nocera
     [not found]               ` <321690127.4797880.1595847834329.JavaMail.zimbra-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2020-07-27 12:49                 ` Nitin Joshi1
2020-07-02  9:29     ` Andy Shevchenko
     [not found]       ` <CAHp75VeO5SzYs=kRh+BV_vydO7PTPLkmu8aiYXvSJFTewSTYwA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2020-07-02 10:44         ` [External] " Mark Pearson
     [not found]           ` <7d0e1dcc-7285-71e1-7125-604cb2630595-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
2020-07-02 10:56             ` Andy Shevchenko
2020-07-03  1:23 ` [PATCH v5] " Mark Pearson
     [not found]   ` <20200703012353.26413-1-markpearson-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
2020-07-09 18:02     ` Andy Shevchenko
     [not found]       ` <CAHp75Vcs15wGCzwW8Pq7AXyqQnvnopNdFP1nDE0nf+ZTz=9zFw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2020-07-10  8:00         ` Hans de Goede
     [not found]           ` <7c1698a6-ebd6-553d-a686-d9bd4e5a5e99-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2020-07-10 12:20             ` Andy Shevchenko
     [not found]               ` <CAHp75Ve-qOs8VosoxEaHH1EnK-r16Sx0ki3uj14yZJWyuwC88w-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2020-07-10 12:28                 ` [External] " Mark Pearson
2020-07-10 20:39     ` Andy Shevchenko
2020-07-15 23:52 ` Mark Pearson [this message]
     [not found]   ` <20200715235242.4934-1-markpearson-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
2020-07-27 10:34     ` [PATCH] platform/x86: thinkpad_acpi: psensor interface Andy Shevchenko
2020-07-28  3:51       ` [External] " Nitin Joshi1
     [not found]         ` <PU1PR03MB2716FE7EF1BF12E5B9EC25188C730-PIfHAIETUCsWqO6DXxnA3a82SN/2zMuYvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2020-08-07 20:40           ` Mark Pearson
2020-07-22 17:11 ` [PATCH] platform/x86: thinkpad_acpi: performance mode interface Mark Pearson
     [not found]   ` <20200722171108.65185-1-markpearson-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
2020-07-22 18:46     ` Limonciello, Mario
     [not found]       ` <DM6PR19MB263650F7DC4B6680A5EFC5DAFA790-JELcaX3dgTY1BKDJOnGuQNvXXbHMiUzJvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2020-07-22 19:29         ` [External] " Mark Pearson
     [not found]           ` <b79e0359-536d-f496-a01e-fe4c4b7796cc-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
2020-07-22 19:46             ` Limonciello, Mario
     [not found]               ` <DM6PR19MB26360DE8FCA56BC132644F98FA790-JELcaX3dgTY1BKDJOnGuQNvXXbHMiUzJvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2020-07-23  0:34                 ` Mark Pearson
     [not found]                   ` <e14aa227-493b-4206-eaef-81874512166f-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
2020-07-23  1:36                     ` Limonciello, Mario
2020-08-12 18:53 ` [PATCH v2] platform/x86: thinkpad_acpi: psensor interface Mark Pearson
2020-08-18 19:15 ` [PATCH v3] " Mark Pearson
2020-08-21 17:53 ` [PATCH v2] platform/x86: thinkpad_acpi: performance mode interface Mark Pearson
     [not found]   ` <20200821175310.335873-1-markpearson-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
2020-08-21 19:15     ` Limonciello, Mario
     [not found]       ` <DM6PR19MB2636F1CFCE1E386D6E793E25FA5B0-JELcaX3dgTY1BKDJOnGuQNvXXbHMiUzJvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2020-08-21 19:35         ` [External] " Mark Pearson
     [not found]           ` <1806c4ec-6788-bcc7-7e09-8e5274d2b9d5-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
2020-08-21 20:00             ` Limonciello, Mario
     [not found]               ` <DM6PR19MB26369308415B8235B3C9997EFA5B0-JELcaX3dgTY1BKDJOnGuQNvXXbHMiUzJvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2020-08-21 20:06                 ` Mark Pearson
     [not found]                   ` <9e0c14a9-3b24-4b64-6d9e-b312d28dfd44-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
2020-08-21 20:43                     ` Limonciello, Mario
     [not found]                       ` <DM6PR19MB263621A07F59D91C8E2F7205FA5B0-JELcaX3dgTY1BKDJOnGuQNvXXbHMiUzJvxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2020-08-22  1:31                         ` Mark Pearson
     [not found]                           ` <52fc84b9-f87d-c91d-4d24-1db768c5c812-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org>
2020-08-24 15:20                             ` Limonciello, Mario
2020-09-16  9:31     ` Benjamin Berg
     [not found]       ` <11594528cfb96e2eed8fe0f27a4ecc1d60803432.camel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2020-09-16 11:15         ` [External] " Mark Pearson
2020-09-17 11:39   ` Hans de Goede
2020-09-17 13:48     ` [External] " Mark Pearson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200715235242.4934-1-markpearson@lenovo.com \
    --to=markpearson-6jq1ytarvr3qt0dzr+alfa@public.gmane.org \
    --cc=ibm-acpi-N3TV7GIv+o9fyO9Q7EP/yw@public.gmane.org \
    --cc=ibm-acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    --cc=njoshi1-6jq1YtArVR3QT0dZR+AlfA@public.gmane.org \
    --cc=platform-driver-x86-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.