From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: James Seo <james@equiv.tech>,
Lukasz Stelmach <l.stelmach@samsung.com>,
Guenter Roeck <linux@roeck-us.net>,
Sasha Levin <sashal@kernel.org>,
jdelvare@suse.com, linux-hwmon@vger.kernel.org
Subject: [PATCH AUTOSEL 6.7 42/88] hwmon: (hp-wmi-sensors) Fix failure to load on EliteDesk 800 G6
Date: Mon, 22 Jan 2024 09:51:15 -0500 [thread overview]
Message-ID: <20240122145608.990137-42-sashal@kernel.org> (raw)
In-Reply-To: <20240122145608.990137-1-sashal@kernel.org>
From: James Seo <james@equiv.tech>
[ Upstream commit c9ba592580947b81f33f514320aeef02ddc001fd ]
The EliteDesk 800 G6 stores a raw WMI string within the ACPI object in its
BIOS corresponding to one instance of HPBIOS_PlatformEvents.Name. This is
evidently a valid way of representing a WMI data item as far as the
Microsoft ACPI-WMI mapper is concerned, but is preventing the driver from
loading.
This seems quite rare, but add support for such strings. Treating this as a
quirk pretty much means adding that support anyway.
Also clean up an oversight in update_numeric_sensor_from_wobj() in which
the result of hp_wmi_strdup() was being used without error checking.
Reported-by: Lukasz Stelmach <l.stelmach@samsung.com>
Closes: https://lore.kernel.org/linux-hwmon/7850a0bd-60e7-88f8-1d6c-0bb0e3234fdc@roeck-us.net/
Tested-by: Lukasz Stelmach <l.stelmach@samsung.com>
Signed-off-by: James Seo <james@equiv.tech>
Link: https://lore.kernel.org/r/20231123054918.157098-1-james@equiv.tech
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/hwmon/hp-wmi-sensors.c | 127 ++++++++++++++++++++++++++++-----
1 file changed, 111 insertions(+), 16 deletions(-)
diff --git a/drivers/hwmon/hp-wmi-sensors.c b/drivers/hwmon/hp-wmi-sensors.c
index 17ae62f88bbf..b5325d0e72b9 100644
--- a/drivers/hwmon/hp-wmi-sensors.c
+++ b/drivers/hwmon/hp-wmi-sensors.c
@@ -17,6 +17,8 @@
* Available: https://github.com/linuxhw/ACPI
* [4] P. Rohár, "bmfdec - Decompile binary MOF file (BMF) from WMI buffer",
* 2017. [Online]. Available: https://github.com/pali/bmfdec
+ * [5] Microsoft Corporation, "Driver-Defined WMI Data Items", 2017. [Online].
+ * Available: https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/driver-defined-wmi-data-items
*/
#include <linux/acpi.h>
@@ -24,6 +26,7 @@
#include <linux/hwmon.h>
#include <linux/jiffies.h>
#include <linux/mutex.h>
+#include <linux/nls.h>
#include <linux/units.h>
#include <linux/wmi.h>
@@ -395,6 +398,50 @@ struct hp_wmi_sensors {
struct mutex lock; /* Lock polling WMI and driver state changes. */
};
+static bool is_raw_wmi_string(const u8 *pointer, u32 length)
+{
+ const u16 *ptr;
+ u16 len;
+
+ /* WMI strings are length-prefixed UTF-16 [5]. */
+ if (length <= sizeof(*ptr))
+ return false;
+
+ length -= sizeof(*ptr);
+ ptr = (const u16 *)pointer;
+ len = *ptr;
+
+ return len <= length && !(len & 1);
+}
+
+static char *convert_raw_wmi_string(const u8 *buf)
+{
+ const wchar_t *src;
+ unsigned int cps;
+ unsigned int len;
+ char *dst;
+ int i;
+
+ src = (const wchar_t *)buf;
+
+ /* Count UTF-16 code points. Exclude trailing null padding. */
+ cps = *src / sizeof(*src);
+ while (cps && !src[cps])
+ cps--;
+
+ /* Each code point becomes up to 3 UTF-8 characters. */
+ len = min(cps * 3, HP_WMI_MAX_STR_SIZE - 1);
+
+ dst = kmalloc((len + 1) * sizeof(*dst), GFP_KERNEL);
+ if (!dst)
+ return NULL;
+
+ i = utf16s_to_utf8s(++src, cps, UTF16_LITTLE_ENDIAN, dst, len);
+ dst[i] = '\0';
+
+ return dst;
+}
+
/* hp_wmi_strdup - devm_kstrdup, but length-limited */
static char *hp_wmi_strdup(struct device *dev, const char *src)
{
@@ -412,6 +459,23 @@ static char *hp_wmi_strdup(struct device *dev, const char *src)
return dst;
}
+/* hp_wmi_wstrdup - hp_wmi_strdup, but for a raw WMI string */
+static char *hp_wmi_wstrdup(struct device *dev, const u8 *buf)
+{
+ char *src;
+ char *dst;
+
+ src = convert_raw_wmi_string(buf);
+ if (!src)
+ return NULL;
+
+ dst = hp_wmi_strdup(dev, strim(src)); /* Note: Copy is trimmed. */
+
+ kfree(src);
+
+ return dst;
+}
+
/*
* hp_wmi_get_wobj - poll WMI for a WMI object instance
* @guid: WMI object GUID
@@ -462,8 +526,14 @@ static int check_wobj(const union acpi_object *wobj,
for (prop = 0; prop <= last_prop; prop++) {
type = elements[prop].type;
valid_type = property_map[prop];
- if (type != valid_type)
+ if (type != valid_type) {
+ if (type == ACPI_TYPE_BUFFER &&
+ valid_type == ACPI_TYPE_STRING &&
+ is_raw_wmi_string(elements[prop].buffer.pointer,
+ elements[prop].buffer.length))
+ continue;
return -EINVAL;
+ }
}
return 0;
@@ -480,7 +550,9 @@ static int extract_acpi_value(struct device *dev,
break;
case ACPI_TYPE_STRING:
- *out_string = hp_wmi_strdup(dev, strim(element->string.pointer));
+ *out_string = element->type == ACPI_TYPE_BUFFER ?
+ hp_wmi_wstrdup(dev, element->buffer.pointer) :
+ hp_wmi_strdup(dev, strim(element->string.pointer));
if (!*out_string)
return -ENOMEM;
break;
@@ -861,7 +933,9 @@ update_numeric_sensor_from_wobj(struct device *dev,
{
const union acpi_object *elements;
const union acpi_object *element;
- const char *string;
+ const char *new_string;
+ char *trimmed;
+ char *string;
bool is_new;
int offset;
u8 size;
@@ -885,11 +959,21 @@ update_numeric_sensor_from_wobj(struct device *dev,
offset = is_new ? size - 1 : -2;
element = &elements[HP_WMI_PROPERTY_CURRENT_STATE + offset];
- string = strim(element->string.pointer);
-
- if (strcmp(string, nsensor->current_state)) {
- devm_kfree(dev, nsensor->current_state);
- nsensor->current_state = hp_wmi_strdup(dev, string);
+ string = element->type == ACPI_TYPE_BUFFER ?
+ convert_raw_wmi_string(element->buffer.pointer) :
+ element->string.pointer;
+
+ if (string) {
+ trimmed = strim(string);
+ if (strcmp(trimmed, nsensor->current_state)) {
+ new_string = hp_wmi_strdup(dev, trimmed);
+ if (new_string) {
+ devm_kfree(dev, nsensor->current_state);
+ nsensor->current_state = new_string;
+ }
+ }
+ if (element->type == ACPI_TYPE_BUFFER)
+ kfree(string);
}
/* Old variant: -2 (not -1) because it lacks the Size property. */
@@ -996,11 +1080,15 @@ static int check_event_wobj(const union acpi_object *wobj)
HP_WMI_EVENT_PROPERTY_STATUS);
}
-static int populate_event_from_wobj(struct hp_wmi_event *event,
+static int populate_event_from_wobj(struct device *dev,
+ struct hp_wmi_event *event,
union acpi_object *wobj)
{
int prop = HP_WMI_EVENT_PROPERTY_NAME;
union acpi_object *element;
+ acpi_object_type type;
+ char *string;
+ u32 value;
int err;
err = check_event_wobj(wobj);
@@ -1009,20 +1097,24 @@ static int populate_event_from_wobj(struct hp_wmi_event *event,
element = wobj->package.elements;
- /* Extracted strings are NOT device-managed copies. */
-
for (; prop <= HP_WMI_EVENT_PROPERTY_CATEGORY; prop++, element++) {
+ type = hp_wmi_event_property_map[prop];
+
+ err = extract_acpi_value(dev, element, type, &value, &string);
+ if (err)
+ return err;
+
switch (prop) {
case HP_WMI_EVENT_PROPERTY_NAME:
- event->name = strim(element->string.pointer);
+ event->name = string;
break;
case HP_WMI_EVENT_PROPERTY_DESCRIPTION:
- event->description = strim(element->string.pointer);
+ event->description = string;
break;
case HP_WMI_EVENT_PROPERTY_CATEGORY:
- event->category = element->integer.value;
+ event->category = value;
break;
default:
@@ -1511,8 +1603,8 @@ static void hp_wmi_notify(u32 value, void *context)
struct acpi_buffer out = { ACPI_ALLOCATE_BUFFER, NULL };
struct hp_wmi_sensors *state = context;
struct device *dev = &state->wdev->dev;
+ struct hp_wmi_event event = {};
struct hp_wmi_info *fan_info;
- struct hp_wmi_event event;
union acpi_object *wobj;
acpi_status err;
int event_type;
@@ -1546,7 +1638,7 @@ static void hp_wmi_notify(u32 value, void *context)
wobj = out.pointer;
- err = populate_event_from_wobj(&event, wobj);
+ err = populate_event_from_wobj(dev, &event, wobj);
if (err) {
dev_warn(dev, "Bad event data (ACPI type %d)\n", wobj->type);
goto out_free_wobj;
@@ -1577,6 +1669,9 @@ static void hp_wmi_notify(u32 value, void *context)
out_free_wobj:
kfree(wobj);
+ devm_kfree(dev, event.name);
+ devm_kfree(dev, event.description);
+
out_unlock:
mutex_unlock(&state->lock);
}
--
2.43.0
next prev parent reply other threads:[~2024-01-22 14:58 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-22 14:50 [PATCH AUTOSEL 6.7 01/88] f2fs: fix to check return value of f2fs_reserve_new_block() Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 02/88] ALSA: hda: Refer to correct stream index at loops Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 03/88] ASoC: doc: Fix undefined SND_SOC_DAPM_NOPM argument Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 04/88] drm: Fix color LUT rounding Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 05/88] fast_dput(): handle underflows gracefully Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 06/88] reiserfs: Avoid touching renamed directory if parent does not change Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 07/88] ocfs2: " Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 08/88] drm/msm/a690: Fix reg values for a690 Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 09/88] RDMA/IPoIB: Fix error code return in ipoib_mcast_join Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 10/88] ASoC: SOF: icp3-dtrace: Fix wrong kfree() usage Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 11/88] drm/panel-edp: Add override_edid_mode quirk for generic edp Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 12/88] drm/bridge: anx7625: Fix Set HPD irq detect window to 2ms Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 13/88] drm/amd/display: Fix tiled display misalignment Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 14/88] media: renesas: vsp1: Fix references to pad config Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 15/88] f2fs: fix write pointers on zoned device after roll forward Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 16/88] ASoC: amd: Add new dmi entries for acp5x platform Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 17/88] drm/amd/display: initialize all the dpm level's stutter latency Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 18/88] drm/amd/display: Fix MST PBN/X.Y value calculations Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 19/88] drm/amd/display: Fix disable_otg_wa logic Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 20/88] drm/amd/display: Fix Replay Desync Error IRQ handler Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 21/88] drm/amd/display: add support for DTO genarated dscclk Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 22/88] drm/amd/display: Fix writeback_info never got updated Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 23/88] drm/amd/display: Fix writeback_info is not removed Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 24/88] drm/drm_file: fix use of uninitialized variable Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 25/88] drm/framebuffer: Fix " Sasha Levin
2024-01-22 14:50 ` [PATCH AUTOSEL 6.7 26/88] drm/mipi-dsi: Fix detach call without attach Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 27/88] media: stk1160: Fixed high volume of stk1160_dbg messages Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 28/88] media: rockchip: rga: fix swizzling for RGB formats Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 29/88] PCI: add INTEL_HDA_ARL to pci_ids.h Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 30/88] ALSA: hda: Intel: add HDA_ARL PCI ID support Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 31/88] ALSA: hda: intel-dspcfg: add filters for ARL-S and ARL Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 32/88] drm/msm/dp: Add DisplayPort controller for SM8650 Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 33/88] media: uvcvideo: Fix power line control for a Chicony camera Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 34/88] media: uvcvideo: Fix power line control for SunplusIT camera Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 35/88] media: rkisp1: Drop IRQF_SHARED Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 36/88] media: rkisp1: Fix IRQ handler return values Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 37/88] media: rkisp1: Store IRQ lines Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 38/88] media: rkisp1: Fix IRQ disable race issue Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 39/88] media: rkisp1: resizer: Stop manual allocation of v4l2_subdev_state Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 40/88] hwmon: (nct6775) Fix fan speed set failure in automatic mode Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 41/88] hwmon: (pc87360) Bounds check data->innr usage Sasha Levin
2024-01-22 14:51 ` Sasha Levin [this message]
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 43/88] f2fs: fix to tag gcing flag on page during block migration Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 44/88] drm/exynos: Call drm_atomic_helper_shutdown() at shutdown/unbind time Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 45/88] IB/ipoib: Fix mcast list locking Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 46/88] media: amphion: remove mutext lock in condition of wait_event Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 47/88] media: ddbridge: fix an error code problem in ddb_probe Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 48/88] media: ov2740: Fix hts value Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 49/88] media: i2c: imx335: Fix hblank min/max values Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 50/88] drm/amd/display: For prefetch mode > 0, extend prefetch if possible Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 51/88] drm/amd/display: Force p-state disallow if leaving no plane config Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 52/88] drm/amdkfd: fix mes set shader debugger process management Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 53/88] drm/msm/dpu: enable writeback on SM8350 Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 54/88] drm/msm/dpu: enable writeback on SM8450 Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 55/88] drm/msm/dpu: Ratelimit framedone timeout msgs Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 56/88] drm/msm/dpu: fix writeback programming for YUV cases Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 57/88] drm/msm/dpu: Add mutex lock in control vblank irq Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 58/88] drm/amdgpu: fix ftrace event amdgpu_bo_move always move on same heap Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 59/88] clk: hi3620: Fix memory leak in hi3620_mmc_clk_init() Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 60/88] clk: mmp: pxa168: Fix memory leak in pxa168_clk_init() Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 61/88] watchdog: starfive: add lock annotations to fix context imbalances Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 62/88] watchdog: it87_wdt: Keep WDTCTRL bit 3 unmodified for IT8784/IT8786 Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 63/88] accel/habanalabs: add support for Gaudi2C device Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 64/88] accel/habanalabs: fix EQ heartbeat mechanism Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 65/88] accel/habanalabs/gaudi2: fix undef opcode reporting Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 66/88] drm/amd/display: make flip_timestamp_in_us a 64-bit variable Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 67/88] drm/amd/display: fix usb-c connector_type Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 68/88] drm/amd/display: Fix lightup regression with DP2 single display configs Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 69/88] drm/amd/display: Only clear symclk otg flag for HDMI Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 70/88] clk: imx: scu: Fix memory leak in __imx_clk_gpr_scu() Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 71/88] clk: imx: clk-imx8qxp: fix LVDS bypass, pixel and phy clocks Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 72/88] ALSA: hda/tas2781: add fixup for Lenovo 14ARB7 Sasha Levin
2024-01-22 18:10 ` Gergo Koteles
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 73/88] drm/amdgpu: Fix ecc irq enable/disable unpaired Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 74/88] drm/amd/display: Fix minor issues in BW Allocation Phase2 Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 75/88] drm/amdgpu: Let KFD sync with VM fences Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 76/88] drm/amd/display: Fixing stream allocation regression Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 77/88] Re-revert "drm/amd/display: Enable Replay for static screen use cases" Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 78/88] drm/amdgpu: Fix possible NULL dereference in amdgpu_ras_query_error_status_helper() Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 79/88] drm/amdgpu: Fix variable 'mca_funcs' dereferenced before NULL check in 'amdgpu_mca_smu_get_mca_entry()' Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 80/88] drm/amdgpu: Fix '*fw' from request_firmware() not released in 'amdgpu_ucode_request()' Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 81/88] drm/amdgpu: Drop 'fence' check in 'to_amdgpu_amdkfd_fence()' Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 82/88] drm/amdkfd: Fix iterator used outside loop in 'kfd_add_peer_prop()' Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 83/88] Revert "drm/amdkfd: Relocate TBA/TMA to opposite side of VM hole" Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 84/88] drm/amdgpu: apply the RV2 system aperture fix to RN/CZN as well Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 85/88] ALSA: hda/conexant: Fix headset auto detect fail in cx8070 and SN6140 Sasha Levin
2024-01-22 14:51 ` [PATCH AUTOSEL 6.7 86/88] ksmbd: set v2 lease version on lease upgrade Sasha Levin
2024-01-22 14:52 ` [PATCH AUTOSEL 6.7 87/88] ksmbd: fix potential circular locking issue in smb2_set_ea() Sasha Levin
2024-01-22 14:52 ` [PATCH AUTOSEL 6.7 88/88] ksmbd: send lease break notification on FILE_RENAME_INFORMATION Sasha Levin
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=20240122145608.990137-42-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=james@equiv.tech \
--cc=jdelvare@suse.com \
--cc=l.stelmach@samsung.com \
--cc=linux-hwmon@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=stable@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox