]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
platform/x86: thinkpad_acpi: Add debugfs entry to display HWDD raw
authorMark Pearson <mpearson-lenovo@squebb.ca>
Wed, 29 Apr 2026 01:51:59 +0000 (21:51 -0400)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Mon, 11 May 2026 16:34:28 +0000 (19:34 +0300)
The Lenovo diagnostics and support team have requested a mechanism
to get the raw data from the HWDD commands to support customer debug
situations.

Add a debugfs entry to display the HWDD raw data.

Signed-off-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Link: https://patch.msgid.link/20260429015210.1863316-1-mpearson-lenovo@squebb.ca
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/lenovo/thinkpad_acpi.c

index d4ed6f1216f20a154405307f4a9026cff451f104..445e1403308eeaadfdbc836a9a09280393a6fd63 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/backlight.h>
 #include <linux/bitfield.h>
 #include <linux/bitops.h>
+#include <linux/debugfs.h>
 #include <linux/delay.h>
 #include <linux/dmi.h>
 #include <linux/freezer.h>
@@ -11216,6 +11217,26 @@ static ssize_t hwdd_status_show(struct device *dev,
 
        return sysfs_emit(buf, "0\n");
 }
+
+/* sysfs type-c damage detection raw data - accessed via debugfs*/
+static int hwdd_raw_show(struct seq_file *m, void *v)
+{
+       unsigned int damage_status;
+       int err;
+
+       if (!ucdd_supported)
+               return -ENODEV;
+
+       /* Get USB TYPE-C damage status */
+       err = hwdd_command(HWDD_GET_DMG_USBC, &damage_status);
+       if (err)
+               return err;
+
+       seq_printf(m, "HWDD: 0x%x\n", damage_status);
+       return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(hwdd_raw);
+
 static DEVICE_ATTR_RO(hwdd_status);
 static DEVICE_ATTR_RO(hwdd_detail);
 
@@ -11503,6 +11524,20 @@ static const char * __init str_supported(int is_supported)
 }
 #endif /* CONFIG_THINKPAD_ACPI_DEBUG */
 
+static struct dentry *tpacpi_dbg;
+static void tpacpi_debugfs_init(void)
+{
+       tpacpi_dbg = debugfs_create_dir("tpacpi", NULL);
+
+       /* HWDD raw data */
+       debugfs_create_file("hwdd-raw", 0444, tpacpi_dbg, NULL, &hwdd_raw_fops);
+}
+
+static void tpacpi_debugfs_remove(void)
+{
+       debugfs_remove_recursive(tpacpi_dbg);
+}
+
 static void ibm_exit(struct ibm_struct *ibm)
 {
        dbg_printk(TPACPI_DBG_EXIT, "removing %s\n", ibm->name);
@@ -12067,6 +12102,8 @@ static void thinkpad_acpi_module_exit(void)
                remove_proc_entry(TPACPI_PROC_DIR, acpi_root_dir);
        if (tpacpi_wq)
                destroy_workqueue(tpacpi_wq);
+       if (tpacpi_dbg)
+               tpacpi_debugfs_remove();
 
        kfree(thinkpad_id.bios_version_str);
        kfree(thinkpad_id.ec_version_str);
@@ -12197,6 +12234,8 @@ static int __init thinkpad_acpi_module_init(void)
                return -ENODEV;
        }
 
+       tpacpi_debugfs_init();
+
        dmi_id = dmi_first_match(fwbug_list);
        if (dmi_id)
                tp_features.quirks = dmi_id->driver_data;