platform/x86: thinkpad_acpi: Add profile force ability
authorMark Pearson <mpearson-lenovo@squebb.ca>
Fri, 5 May 2023 13:25:23 +0000 (09:25 -0400)
committerHans de Goede <hdegoede@redhat.com>
Tue, 9 May 2023 08:54:45 +0000 (10:54 +0200)
There has been a lot of confusion around which platform profiles are
supported on various platforms and it would be useful to have a debug
method to be able to override the profile mode that is selected.

I don't expect this to be used in anything other than debugging in
conjunction with Lenovo engineers - but it does give a way to get a
system working whilst we wait for either FW fixes, or a driver fix
to land upstream, if something is wonky in the mode detection logic

Signed-off-by: Mark Pearson <mpearson-lenovo@squebb.ca>
Link: https://lore.kernel.org/r/20230505132523.214338-2-mpearson-lenovo@squebb.ca
Cc: stable@vger.kernel.org
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/platform/x86/thinkpad_acpi.c

index 7976379..b3808ad 100644 (file)
@@ -10318,6 +10318,7 @@ static atomic_t dytc_ignore_event = ATOMIC_INIT(0);
 static DEFINE_MUTEX(dytc_mutex);
 static int dytc_capabilities;
 static bool dytc_mmc_get_available;
+static int profile_force;
 
 static int convert_dytc_to_profile(int funcmode, int dytcmode,
                enum platform_profile_option *profile)
@@ -10580,6 +10581,21 @@ static int tpacpi_dytc_profile_init(struct ibm_init_struct *iibm)
        if (err)
                return err;
 
+       /* Check if user wants to override the profile selection */
+       if (profile_force) {
+               switch (profile_force) {
+               case -1:
+                       dytc_capabilities = 0;
+                       break;
+               case 1:
+                       dytc_capabilities = BIT(DYTC_FC_MMC);
+                       break;
+               case 2:
+                       dytc_capabilities = BIT(DYTC_FC_PSC);
+                       break;
+               }
+               pr_debug("Profile selection forced: 0x%x\n", dytc_capabilities);
+       }
        if (dytc_capabilities & BIT(DYTC_FC_MMC)) { /* MMC MODE */
                pr_debug("MMC is supported\n");
                /*
@@ -11641,6 +11657,9 @@ MODULE_PARM_DESC(uwb_state,
                 "Initial state of the emulated UWB switch");
 #endif
 
+module_param(profile_force, int, 0444);
+MODULE_PARM_DESC(profile_force, "Force profile mode. -1=off, 1=MMC, 2=PSC");
+
 static void thinkpad_acpi_module_exit(void)
 {
        struct ibm_struct *ibm, *itmp;